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

Posted

技术标签:

【中文标题】如何从代码中动态设置 layout_weight 属性?【英文标题】:How to set layout_weight attribute dynamically from code? 【发布时间】:2011-06-06 04:17:55 【问题描述】:

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

【问题讨论】:

这将与这个问题/答案非常相似:***.com/questions/4638832/… 和这个问题/答案:***.com/questions/4637233/… 如果您已经在 layout(xml) 文件中定义了视图,那么创建新的 LayoutParams 会覆盖 xml 文件中定义的其他参数。所以首先你应该使用“getLayoutParams”。查看完整答案***.com/questions/4641072/… 【参考方案1】:

我已经通过添加这行代码完成了我的任务!

LinearLayout.LayoutParams mylayout = (LinearLayout.LayoutParams)   
myview.getLayoutParams();
mylayout.weight = 2;
myview.setLayoutParams(mylayout);

【讨论】:

【参考方案2】:

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

如果要根据权重设置宽度,在构造函数中设置宽度为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);

【讨论】:

正是我需要的!每个人都在这里谈论设置权重,没有人显示将这些称重的子项添加到父视图时会发生什么!我实际上是在寻找如何在 ParentView 上添加 weightSum !谢谢!【参考方案3】:

使用 Kotlin,您可以执行以下操作:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView 
    constructor(context: Context) : super(context) 
        init(context)
    

    private fun init(context: Context) 


        val parent = LinearLayout(context)

        parent.apply 
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply 
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply 
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply 
                    
                )
                addView(ImageButton(context).apply(
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply 
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    
                ))
            
        
        this.addView(parent)
    

【讨论】:

【参考方案4】:

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

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

【讨论】:

被低估的答案【参考方案5】:

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

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

最后一个参数是权重。

【讨论】:

应该是param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0); 如果你不想从 double 转换为 float,只需输入 1.0f 如果没有小数位,则更简单的是1f 如果父布局是Relative怎么办 @pratik 如果父布局是相对的,则不使用权重【参考方案6】:

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

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

新的 LayoutParams 会覆盖您在 xml 文件中定义的其他参数,例如边距,或者您需要在 LayoutParams 中指定所有这些参数。

【讨论】:

使用“params.weight = 1f;”您已经在 LayoutParams 对象上设置了权重。无需调用“mButton.setLayoutParams(params);”。 不,你必须调用 setLayoutParams 这实际上是最优雅的答案,它直接更改特定的 UI 对象。最好的答案也很好,而且比这篇文章更老。所以它值得作为最佳答案。不过我赞成这篇文章。 伟大而简单的解决方案! 像魅力一样工作!非常感谢:)【参考方案7】:

如果您已经在 layout(xml) 文件中定义了视图并且只想以编程方式更改权重,那么创建新的 LayoutParams 会覆盖在您的 xml 文件中定义的其他参数。

所以首先你应该使用“getLayoutParams”然后 setLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);

【讨论】:

【参考方案8】:

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

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

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

【讨论】:

这应该是公认的答案,因为它不会修改任何先前设置的变量,如宽度/高度/边距/填充等。在更改权重时,所有内容都会被保留和重复使用。跨度> 如果设置layout_weight的视图已经布局,需要调用View.requestLayout()更新。【参考方案9】:

LinearLayout.LayoutParamsTableLayout.LayoutParams 中的任何一个都为我工作,右边的按钮是 TableRow.LayoutParams。那就是:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

关于使用MATCH_PARENTWRAP_CONTENT是一样的。

【讨论】:

FILL_PARENT 已被弃用,应改用MATCH_PARENT 我认为 LayoutParams.MATCH_PARENT 应该改为 0。 您拨打直系父母的LayoutParams。我假设您尝试在没有父 LinearLayout 的情况下使用 LinearLayout.LayoutParams 时发生了崩溃。【参考方案10】:

使用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);

编辑:啊,埃里希的回答更简单!

【讨论】:

Erich 的分析器可能更易于编写,但您的分析器更易于阅读。因为它说明了 1.0f 用于哪个属性。 你已经确定你可以通过调用'view.getLayoutParams()'来修改权重,然后修改值。 FILL_PARENT 已被弃用,应改用MATCH_PARENT @LocalPCGuy 不正确。只要您定位 SDK >= 8(您绝对应该这样做),即使在旧设备上也可以使用MATCH_PARENT 代替FILL_PARENT @LocalPCGuy No one uses API 7 or less anymore。如果您试图使您的应用程序与 API 7 或更低版本兼容,那么在担心 FILL_PARENTMATCH_PARENT 之前,您可能会遇到很多其他问题。

以上是关于如何从代码中动态设置 layout_weight 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复线性布局中的 layout_weight?

从源码角度彻底分析layout_weight使用

从源码角度彻底分析layout_weight使用

layout_weight布局中遇到的问题记录一下

Android知识点剖析系列:深入了解layout_weight属性

layout_weight