以编程方式设置 TextView 的布局权重
Posted
技术标签:
【中文标题】以编程方式设置 TextView 的布局权重【英文标题】:Set the layout weight of a TextView programmatically 【发布时间】:2011-03-14 13:03:12 【问题描述】:我正在尝试动态创建TableRow
对象并将它们添加到TableLayout
。
TableRow
对象有 2 个项目,一个 TextView
和一个 CheckBox
。 TextView
项目需要将其布局权重设置为 1 才能将 CheckBox
项目推到最右侧。
我找不到有关如何以编程方式设置 TextView
项目的布局权重的文档。
【问题讨论】:
【参考方案1】:你必须使用TableLayout.LayoutParams
来做这样的事情:
TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
最后一个参数是权重。
【讨论】:
我之前没有提到这一点,所以很抱歉。但我在问我的问题之前试过这个。它使 TextView 从布局中消失。但是,积极的一面是,我发现将 TableLayout 的 stretch_columns 属性设置为 0 会导致我正在寻找的效果(左侧是 TextView,右侧是 CheckBoxes)。感谢您的帮助。 如果你正在导入一个 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));
要以编程方式设置布局权重,应使用TableRow.LayoutParams
而不是TableLayout.LayoutParams
。请参阅@Dorje 的回答。
导入android.widget.LinearLayout;导入 android.widget.TableLayout;
请注意,大多数人会使用 0 作为第一个或第二个参数(取决于是水平还是垂直)而不是 WRAP_CONTENT,因为他们正在寻找的是设置权重。【参考方案2】:
答案是您必须使用 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 对我不起作用 天啊,你为我节省了很多时间。它在哪里指定?我在文档中没有发现任何关于你不能交换的信息LayoutParams
TableRow.LayoutParams
也为我完成了这项工作
这个答案的关键部分是0
它会减少我的工作时间。我正在寻找这个很长时间。非常好的解决方案【参考方案3】:
在较早的答案中,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);
【讨论】:
loparams 可能为 NULL,因此请确保在调用 setLayoutParams() 之前检查它 @AAgg,不是在实际情况下。如果没有设置宽度和高度,视图就不会膨胀。但我同意 - 在对 null 有疑问时进行检查是一个好习惯。【参考方案4】:TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);
1f 表示为 weight=1;你可以给 2f 或 3f,视图会根据空间移动
【讨论】:
【参考方案5】:只需在该布局中设置布局参数,如
创建参数变量
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 只需检查LinearLayout.LayoutParams
构造函数的来源。第三个参数是重量。或documentation【参考方案6】:
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 称为权重=1;根据您的需要,您可以提供 2f 或 3f,视图将根据空间移动。要在线性布局中指定视图之间的距离,请使用 weightsum 作为“LinearLayout”。
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);
【讨论】:
【参考方案7】:这应该对你有用
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);
param.weight=1.0f;
【讨论】:
【参考方案8】:你也可以像这样单独给重量,
LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
lp1.weight=1;
【讨论】:
【参考方案9】:这对我有用,我希望它也对你有用
先设置父视图的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);
【讨论】:
【参考方案10】:挣扎了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));
【讨论】:
【参考方案11】:还有另一种方法可以做到这一点。如果您只需要设置一个参数,例如'height':
TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
【讨论】:
【参考方案12】:我在解决与此非常相似的解决方案时遇到了相当大的困难:尝试在 TableRow 中有两个按钮,每个按钮都是屏幕宽度的一半。无论出于何种原因,左侧按钮总是大约为宽度的 70%,右侧按钮为 30%。调用 table_layout.setStretchAllColumns(true) 没有任何效果,也没有将按钮的宽度设置为屏幕的一半,也没有设置它们的布局权重。
我最终得到的解决方案是在 TableRows 中嵌套一个 LinearLayout,确实考虑了按钮宽度的值。
TableLayout layout = new TableLayout(this);
TableRow top_row = new TableRow(this);
left_button = styleButton();
right_button = styleButton();
LinearLayout toprow_layout = new LinearLayout (this);
toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
toprow_layout.addView (left_button);
toprow_layout.addView(right_button);
toprow.addView(top_layout);
layout.addView(top_row)
private Button styleButton()
Button btn = new Button (this);
android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
btn.setWidth((int)(display.getWidth()/2)); // set width to half
btn.setHeight(((int)display.getHeight()/6)); // set height to whatevs
btn.setText("foo");
return btn;
【讨论】:
只是为了让您知道未来,解决方案是将 TableRow、Button1 和 Button2 都设置为layout_width=fill_parent
,然后为 button1 和 button2 设置 layout_weight=1
.所有具有 fill_parent 和 layout_weight=1 的元素将在膨胀时被赋予相同的大小。以上是关于以编程方式设置 TextView 的布局权重的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式动态 textview 的文本更改布局中的其他视图,我不希望它