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

Posted

技术标签:

【中文标题】以编程方式设置 TextView 的布局权重【英文标题】:Set the layout weight of a TextView programmatically 【发布时间】:2011-03-14 13:03:12 【问题描述】:

我正在尝试动态创建TableRow 对象并将它们添加到TableLayoutTableRow 对象有 2 个项目,一个 TextView 和一个 CheckBoxTextView 项目需要将其布局权重设置为 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 的文本更改布局中的其他视图,我不希望它

以编程方式获取 TextView 的宽度

Android:如何以编程方式设置布局的大小

Android - 我无法以编程方式设置 EditText 布局宽度

如何以编程方式添加TextView并在布局中对齐它们

以编程方式更改约束布局中的高度?