以编程方式设置TextView的布局权重

223
我正在尝试动态创建TableRow对象并将它们添加到TableLayout中。 这些TableRow对象包含两个项目,一个TextView和一个CheckBox。需要将TextView的布局权重设置为1,以将CheckBox推到最右边。
我找不到如何以编程方式设置TextView项目的布局权重的文档。
12个回答

365

你需要使用TableLayout.LayoutParams,并使用类似以下代码:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
最后一个参数是权重。

15
之前我没有提到过这个,所以很抱歉。但在提问之前,我已经尝试过了。它会使TextView从布局中消失。但是,值得一提的是,我发现将TableLayout的stretch_columns属性设置为0可以达到我想要的效果(TextView在左边,复选框在右边)。感谢您的帮助。 - eugene
8
如果你正在导入一个 XML 布局并且不是动态创建布局,你可以像这样获取它:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f)); - Eric Leschinski
7
为了在程序中设置布局权重,应该使用TableRow.LayoutParams而不是TableLayout.LayoutParams。请参见@Dorje的答案。 - Halil
导入 android.widget.LinearLayout; 导入 android.widget.TableLayout; - Prakash
1
请注意,大多数人会将第一个或第二个参数(取决于是水平还是垂直)设置为0,而不是WRAP_CONTENT,因为他们要设置的是权重。 - FlorianB
table.setStretchAllColumns(true); - Hack06

101
答案是您需要使用TableRow.LayoutParams,而不是LinearLayout.LayoutParams或任何其他LayoutParams。
TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

不同的LayoutParams并不可互换,如果使用错误的话,似乎什么都不会发生。文本视图的父元素是一个表格行,因此:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html


这个答案对我帮助很大...TableLayout 对我没有起作用。 - shyam.y
哇,你节省了我很多时间。它在哪里指定?我在文档中发现没有关于不能交换 LayoutParams 的内容。 - Adrien Cadet
TableRow.LayoutParams 对我也起到了作用。 - Menelaos Kotsollaris
6
本答案的关键部分是0。 - Leon
它将减少我的工作时间。我已经寻找这个很长时间了。非常棒的解决方案。 - SIVAKUMAR.J

41
在之前的答案中,weight被传递给一个新的SomeLayoutType.LayoutParams对象的构造函数。但在许多情况下,使用现有对象更方便-它可以避免处理我们不感兴趣的参数。
例如:
// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);

lopams 可能为 NULL,所以在调用 setLayoutParams() 之前,请确保您进行了检查。 - AAgg
@AAgg,这并不是一个实际的情况。如果没有设置宽度和高度,视图就不会被充满。但我同意 - 当存在关于空值的疑虑时,检查是一个好习惯。 - sberezin

17
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f被表示为权重=1;您可以使用2f或3f,视图将根据空间移动


13

只需在该布局中设置布局参数,例如

创建参数变量

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f 是权重变量。

将您的小部件或布局设置为:

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);

你从哪里获得1f表示权重变量的信息?能提供一个链接吗? - hayonj
@hayonj 只需检查 LinearLayout.LayoutParams 构造函数的源代码。第三个参数是权重。或者请参阅文档 - mente

11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(或者)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f被称为weight=1; 根据您的需要,您可以设置2f或3f,视图将根据空间移动。在LinearLayout中使用weightsum指定视图之间的距离。

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);

10

这应该适用于您

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;

7
您可以这样单独设置权重:
LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;

6
这对我有用,我希望它也对你有用。
首先为父视图设置LayoutParams:
myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

然后为TextView(子控件)设置:
 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 

2

在苦苦挣扎了4个小时之后,终于,这段代码对我起作用了。

每行有3列。

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接