[英]Set margins in a LinearLayout programmatically
我正在尝试使用 Java(而不是 XML )来创建一个带有填充屏幕和边距的按钮的 LinearLayout。 这是没有边距的代码:
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
所以这很好用,但是你到底如何给按钮边距以便它们之间有空间? 我尝试使用LinearLayout.MarginLayoutParams
,但它没有weight
成员,所以不好。 如果你在它的构造函数中传递lp
它也不起作用。
这是不可能的吗? 因为它看起来确实如此,而且它不会是您只能在 XML 中执行的第一个 Android 布局任务。
这是一个小代码来完成它:
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30, 20, 30, 0);
Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);
所以这很好用,但是你到底如何给按钮边距以便它们之间有空间?
您在LinearLayout.LayoutParams
对象上调用setMargins()
。
我尝试使用 LinearLayout.MarginLayoutParams,但它没有权重成员,所以不好。
LinearLayout.LayoutParams
是的子类LinearLayout.MarginLayoutParams
,作为在所指示的文档。
这是不可能的吗?
不。
它不会是您只能在 XML 中执行的第一个 Android 布局任务
欢迎您提供此声明的证据。
就我个人而言,我不知道任何只能通过 XML 而不能通过 SDK 中的 Java 方法完成的事情。 事实上,根据定义,一切都必须通过 Java 实现(尽管不一定通过 SDK 可访问的方法),因为 XML 不是可执行代码。 但是,如果您知道某些事情,请指出,因为这是 SDK 中的一个错误,应该有一天会得到修复。
要直接向项目添加边距(某些项目允许直接编辑边距),您可以执行以下操作:
LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
((MarginLayoutParams) lp).topMargin = ...;
((MarginLayoutParams) lp).leftMargin = ...;
//... etc
}
else
Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );
...无需了解/编辑周围布局即可工作。 请注意“instanceof”检查,以防您尝试针对不支持边距的内容运行此检查。
由于设备屏幕像素密度的变化,最好始终使用DIP
单元以编程方式设置边距。 喜欢下面_
//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));
//set margin...
yourLayoutTOsetMargin.setLayoutParams(params);
希望这会有所帮助。
我直接使用下面的代码设置了边距
LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
params.setMargins(3, 300, 3, 3);
layout.setLayoutParams(params);
这里唯一要注意的是,应该为以下包android.widget.RelativeLayout.LayoutParams
导入LayoutParams
,否则会出现错误。
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
试试这个
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
试试这个:
MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
/*
* invalid margin
*/
private void invalidMarginBottom() {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
lp.setMargins(0, 0, 0, 0);
frameLayoutContent.setLayoutParams(lp);
}
你应该注意view的viewGroup的类型。在上面的代码中,例如,我想改变frameLayout的margin,而frameLayout的view group是一个RelativeLayout ,所以你需要转换为(RelativeLayout.LayoutParams)
这里有一行解决方案:
((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
updateLayoutParams<RecyclerView.LayoutParams> {
topMargin = 10
rightMargin = 10
bottomMargin = 10
leftMargin = resources.getDimensionPixelSize(R.dimen.left)
}
使用您在 ViewGroup 上的任何视图,而不是 RecycleView。
附注。 Vel_daN:爱你所做的💚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.