如何从代码中动态设置layout_weight属性?

Adh*_*ham 224 android android-layout android-layout-weight

如何layout_weight从java代码中动态设置android中按钮的属性值?

Eri*_*ass 432

您可以将其作为LinearLayout.LayoutParams构造函数的一部分传递:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);
Run Code Online (Sandbox Code Playgroud)

最后一个参数是重量.

  • 如果你不想从double转换为float只需要放1.0f (44认同)
  • @pratik如果父布局是相对的,则不使用权重 (9认同)
  • 如果没有小数位,甚至可以更简单地放置`1f` (7认同)
  • 如果父布局是"相对",该怎么办 (4认同)
  • 它应该是`param = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT,(float)1.0);` (2认同)
  • 我认为,LayoutParams.MATCH_PARENT这两个参数中的一个应该更改为0. (2认同)

kco*_*ock 116

用途LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

编辑:啊,Erich的答案更容易!

  • Erich的anser可能更容易编写,但你的更容易阅读.因为它说明了1.0f用于哪个属性. (26认同)
  • 你的确定你可以通过调用'view.getLayoutParams()'来修改权重,然后修改它. (3认同)
  • @LocalPCGuy不是这样.只要您*目标*SDK> = 8(您绝对应该这样),即使在旧设备上也可以使用`MATCH_PARENT`代替`FILL_PARENT`. (2认同)
  • @LocalPCGuy [没有人再使用API​​ 7或更少](http://developer.android.com/about/dashboards/index.html).如果你想使你的应用程序使用API​​小于或等于7兼容的,你可能会担心`FILL_PARENT`与`MATCH_PARENT`前碰上了一大堆的其他问题. (2认同)

小智 81

如果您已经在layout(xml)文件中定义了视图,只想以编程方式更改权重,这种方式更好

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

new a LayoutParams会覆盖您在xml文件中定义的其他参数,如margin,或者您需要在LayoutParams中指定所有这些参数.

  • 用"params.weight = 1f;" 您已经在LayoutParams对象上设置了权重.没有必要调用"mButton.setLayoutParams(params);". (2认同)
  • 不,您必须调用setLayoutParams (2认同)

小智 24

如果宽度,高度和重量的构造函数不起作用,请尝试使用宽度和高度的构造函数.然后手动设置重量.

如果要根据权重设置宽度,请在构造函数中将width设置为0.同样适用于身高.下面的代码适合我.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);
Run Code Online (Sandbox Code Playgroud)


ash*_*ash 14

如果我有人在寻找答案,请使用:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;
Run Code Online (Sandbox Code Playgroud)

如果要从xml文件初始化布局,这比为线性布局提供新的布局参数要方便得多.

  • 如果要设置`layout_weight`的视图已经布局,则需要调用`View.requestLayout()`进行更新。 (2认同)

Sol*_*ake 9

如果layoutparams已经定义(在 XML 中或动态),这是一个单行:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
Run Code Online (Sandbox Code Playgroud)


And*_*ipe 6

任何LinearLayout.LayoutParamsTableLayout.LayoutParams我一起工作,对于正确的按钮TableRow.LayoutParams.那是:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);
Run Code Online (Sandbox Code Playgroud)

关于使用MATCH_PARENTWRAP_CONTENT相同.

  • 不推荐使用`FILL_PARENT`,而应该使用`MATCH_PARENT`. (3认同)