如何以编程方式在顶部和底部的垂直线性布局中设置一个视图?

Posted

技术标签:

【中文标题】如何以编程方式在顶部和底部的垂直线性布局中设置一个视图?【英文标题】:How to set one view in vertical linearlayout in top and another in bottom programmatically? 【发布时间】:2018-12-11 01:42:30 【问题描述】:

我正在尝试以编程方式创建父 LinearLayout 和 3 个文本视图。 一个 TextView 必须在左上角对齐,第二个在 parent 的中心 第三个在屏幕的右侧和底部。一切都必须在代码中完成。 我差不多完成了,但仍有一些问题。 我所有的 3 个视图都在顶部

我的代码:

public class ActivityFour extends AppCompatActivity 
    private LinearLayout mLinearLayout;
    private TextView tv1;
    private TextView tv2;
    private TextView tv3;

    private static final int TV_ID1 = 101;
    private static final int TV_ID2 = 102;
    private static final int TV_ID3 = 103;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        mLinearLayout = new LinearLayout(this);
        mLinearLayout.setOrientation(LinearLayout.VERTICAL);
        ViewGroup.LayoutParams llParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        setContentView(mLinearLayout, llParams);


        LinearLayout.LayoutParams linlayout_params1 =
                new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                                              LinearLayout.LayoutParams.WRAP_CONTENT);

        LinearLayout.LayoutParams linlayout_params2 =
                new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                                              LinearLayout.LayoutParams.WRAP_CONTENT);

        LinearLayout.LayoutParams linlayout_params3 =
                new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                                              LinearLayout.LayoutParams.WRAP_CONTENT);

        linlayout_params1.setMargins(16,16,16,16);
        tv1 = new TextView(this);
        tv1.setId(TV_ID1);
        linlayout_params1.gravity = Gravity.START;
        linlayout_params1.gravity = Gravity.TOP;

        mLinearLayout.addView(tv1, linlayout_params1);
        tv1.setText("TextView number ONE");

        linlayout_params2.setMargins(16,16,16,16);
        tv2 = new TextView(this);
        tv2.setId(TV_ID2);
        linlayout_params2.gravity = Gravity.CENTER;
        mLinearLayout.addView(tv2, linlayout_params2);
        tv2.setText("TextView number TWO");

        linlayout_params3.setMargins(16,16,16,16);
        tv3 = new TextView(this);
        tv3.setId(TV_ID3);
        linlayout_params3.gravity = Gravity.END;
        mLinearLayout.addView(tv3, linlayout_params3);
        tv3.setText("TextView number THREE");
    

将 weight 属性添加到所有 view.params 后,它看起来像这样

【问题讨论】:

【参考方案1】:

为了使LinearLayout 填满所有可用空间,您需要在中间孩子View 上设置android:layout_weight 属性。您可以使用Constructor which takes the weight as third parameter 以编程方式完成此操作:

LinearLayout.LayoutParams linlayout_params2 =
            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                                          LinearLayout.LayoutParams.WRAP_CONTENT, 1);

【讨论】:

在将权重添加到所有 view.params 之后,看起来就像我希望的那样,但底部没有空间。请您看一下订阅中最后添加的图片。 您是否仍然像以前一样为孩子Views 设置android:layout_gravity 我刚刚添加了一个权重,如您所说,作为 textview 的每个布局参数的第三个参数 @Mister Smith - 好吧,我说过只需将属性设置为中间孩子View。它需要一个android:layout_gravity = "center" 现在看起来你丢弃了所有的 layout_gravity 东西(“top|start”是默认值) 您可以为所有三个视图设置相同的 layout_weight,但您必须保留之前的所有 layout_gravity 设置。如果您想了解有什么区别,可以使用LayoutInspector【参考方案2】:
First of all no need to create liner layout for all textview you can do like this:

in xml file :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:id="@+id/test"
    tools:context=".activity.TestActivity"/>

and in activity file :

LinearLayout layout = findViewById(R.id.test);

        TextView product_1 = new TextView(this);
        product_1.setText("Product 1");
        product_1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,0,1f));
        layout.addView(product_1);

        TextView product_2 = new TextView(this);
        product_2.setText("Product 2");
        product_2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,0,1f));
        product_2.setGravity(Gravity.CENTER);
        layout.addView(product_2);

        TextView product_3 = new TextView(this);
        product_3.setText("Product 3");
        product_3.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,0,1f));
        product_3.setGravity(Gravity.END|Gravity.BOTTOM);
        layout.addView(product_3);

【讨论】:

以上是关于如何以编程方式在顶部和底部的垂直线性布局中设置一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:隐藏工具栏后重置底部约束

在 viewWillAppear 中设置约束

以编程方式设置边距不起作用

如何以编程方式删除在 XML 中定义的现有规则?

在其线性布局垂直父Android中将以编程方式创建的单选按钮居中

如何在css中设置超过div顶部和底部的图像?