thisthisthis线程中,我试图找到如何在单个视图上设置边距的答案.不过,我想知道有没有更简单的方法.我将解释为什么我不想使用这种方法:

我有一个自定义按钮,它扩展了按钮.如果背景设置为默认背景以外的内容(通过调用setBackgroundResource(int id)setBackgroundDrawable(Drawable d)),我希望边距为0.如果我称之为:

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

我希望边距重置为-3dp(我已经阅读了here篇如何将像素转换为dp,所以一旦我知道如何在px中设置边距,我就可以自己管理转换).但由于这是在CustomButton类中调用的,父对象可以从LinearLayout到TableLayout不等,我不希望他让父对象判断父对象的实例.我想,这也会有相当好的表现.

另外,当调用(使用LayoutParams)parentLayout.addView(myCustomButton, newParams)时,我不知道这是否会将其添加到正确的位置(但尚未try ),比如说五行的中间按钮.

问题:有没有更简单的方法来编程设置单个按钮的边距

编辑:我知道LayoutParams的方式,但我想要一个避免处理每种不同容器类型的解决方案:

ViewGroup.LayoutParams p = this.getLayoutParams();
    if (p instanceof LinearLayout.LayoutParams) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof TableRow.LayoutParams) {
        TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
}

因为this.getLayoutParams();返回一个ViewGroup.LayoutParams,它不具有属性topMarginbottomMarginleftMarginrightMargin.

推荐答案

您应该使用LayoutParams来设置按钮边距:

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

根据你使用的布局,你应该使用RelativeLayout.LayoutParamsLinearLayout.LayoutParams.

要将dp测量值转换为像素,请try 以下操作:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);

Android相关问答推荐

Jetpack DataStore原生lib已添加到Bundle 包:libdatastore_share_counter.so-那是什么?

如何正确增加LazyStream中的变量

Kotlin多平台向导,不兼容版本(ANP 8.2.0)ANP 8.1.2

ENV变量在gradle进程中没有更新

Android可组合继承?

推断的类型是片段,但应为上下文

Android Kotlin ImageView内置于Kotlin ImageView中.适配器未按预期更新

为什么我有多个Player实例?

FireBase Android ChildEventListener在被规则拒绝时触发(RTDB)

如何共享没有';t是否存在?(仅信息)在Android?

Visual Studio 2022,毛伊岛,Android Emulator:无法更改内存量

如何正确创建可拖动的浮动视图?

通过 setIntentScanningStrategyEnabled(true) 未检测到信标的 Android Beacon 库后台扫描

未找到 com.android.tools.build:gradle:7.4.0 的匹配变体

在 react native 中设置 react-native-paper 组件的样式

viewModel 的可变值状态不起作用

处理程序 postDelayed 方法不起作用,kotlin 应用程序卡在启动画面上

将应用更改为暗模式后 Android MainActivity 数据泄漏

如何在 Android 上移动 EditText 上的图标?

单个用户可以在 Firebase 身份验证中将多个电话号码链接到他的帐户吗?