最佳答案
在这, 这和这线程中,我试图找到如何在单个视图上设置边缘的答案。然而,我想知道是否有更简单的方法。我将解释为什么我不想使用这种方法:
我有一个自定义按钮扩展按钮。如果背景被设置为默认背景以外的其他内容(通过调用setBackgroundResource(int id)
或setBackgroundDrawable(Drawable d)
),我希望页边距为0。如果我调用这个:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
我希望边距重置为-3dp(我已经阅读了在这里如何从像素转换为dp,所以一旦我知道如何在px中设置边距,我就可以自己管理转换)。但由于这是在CustomButton
类中调用的,父类可以从LinearLayout到TableLayout,我宁愿不让他获取父类并检查该父类的实例。我想那也不太合适。
另外,当调用(使用LayoutParams) parentLayout.addView(myCustomButton, newParams)
时,我不知道这是否会将它添加到正确的位置(但是还没有尝试过),比如5个按钮的中间。
问:有没有更简单的方法以编程方式设置单个Button 除了使用LayoutParams?的边距
编辑:我知道的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);
}
}
因为__abc0返回一个ViewGroup.LayoutParams
,它没有属性topMargin
, bottomMargin
, leftMargin
, rightMargin
。
你看到的mc实例只是一个MarginContainer
,它包含偏移量(-3dp)边距和(oml, omr, omt, omb)和原始边距(ml, mr, mt, mb)