在这个线程中,我试图找到关于如何在单个视图上设置边距的答案。但是,我想知道是否没有更简单的方法。我将解释为什么我不想使用这种方法:
我有一个扩展按钮的自定义按钮。如果背景设置为默认背景以外的其他内容(通过调用setBackgroundResource(int id)或setBackgroundDrawable(Drawable d)),我希望边距为 0。如果我称之为:
setBackgroundResource(int id)
setBackgroundDrawable(Drawable d)
public void setBackgroundToDefault() { backgroundIsDefault = true; super.setBackgroundResource(android.R.drawable.btn_default); // Set margins somehow }
我希望将边距重置为 -3dp,阅读了如何从像素转换为 dp,所以一旦我知道如何在 px 中设置边距,我就可以自己管理转换)。但是由于这是在CustomButton类中调用的,因此父级可以从 LinearLayout 到 TableLayout 不等,我宁愿不让他得到他的父级并检查该父级的实例。我想,这也将是非常低效的。
CustomButton
另外,当调用 (使用 LayoutParams) 时parentLayout.addView(myCustomButton, newParams),我不知道这是否将它添加到正确的位置(但是没有尝试过),比如一排五个的中间按钮。
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();返回 a ViewGroup.LayoutParams,它没有属性topMargin, bottomMargin, leftMargin, rightMargin。您看到的 mc 实例只是一个MarginContainer包含偏移 (-3dp) 边距和 (oml, omr, omt, omb) 和原始边距 (ml, mr, mt, mb) 的实例。
this.getLayoutParams();
ViewGroup.LayoutParams
topMargin
bottomMargin
leftMargin
rightMargin
MarginContainer
您应该使用LayoutParams设置按钮边距:
LayoutParams
LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ); params.setMargins(left, top, right, bottom); yourbutton.setLayoutParams(params);
根据您使用的布局,您应该使用RelativeLayout.LayoutParams或LinearLayout.LayoutParams。
RelativeLayout.LayoutParams
LinearLayout.LayoutParams
并将您的 dp 度量转换为像素,请尝试以下操作:
Resources r = mContext.getResources(); int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, yourdpmeasure, r.getDisplayMetrics() );