在这个,这个和这个线程中,我试图找到一个关于如何在单个视图上设置边距的答案。但是,我想知道是否没有更简单的方法。我将解释为什么我不想使用这种方法:
我有一个自定义按钮,它扩展了Button。如果背景设置为默认背景以外的其他值(通过调用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)
,我不知道这是否将其添加到正确的位置(不过,还没有尝试过),说出一行五行的中间按钮。
问题:除了使用LayoutParams之外,还有其他任何更简便的方法以编程方式设置单个Button的边距吗?
编辑:我知道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
,不具有的属性topMargin
,bottomMargin
,leftMargin
,rightMargin
。您看到的mc实例只是一个MarginContainer
包含偏移量(-3dp)边距和(oml,omr,omt,omb)和原始边距(ml,mr,mt,mb)的mc实例。