将 TextView 动态水平添加到等权线性布局

Posted

技术标签:

【中文标题】将 TextView 动态水平添加到等权线性布局【英文标题】:Horizontally Add TextViews to Equally Weighted Linear Layout Dynamically 【发布时间】:2021-01-28 15:46:56 【问题描述】:

为此,我正在自己学习 android,我想动态地将文本视图添加到具有相同权重的线性布局中,例如:

textview1 textview2(以此类推)

但是如果只有一个文本视图,它应该填充父级,它应该是匹配的父级,如果有两个项目,那么它们应该为每个项目填充一半的父级!

所以这是我在回收站视图中使用文本视图动态填充线性布局的填充方法:

private void populateResourcesItems(ArrayList<ResourcesItem> resources, int position, RecyclerViewHolder recyclerViewHolder) 
        recyclerViewHolder.resourceItemsLayout.removeAllViews();
        for (int its = 0; its < resources.size(); its++) 
            PackagesViewItem packagesViewItem = new PackagesViewItem(context);
            if (hasValue(resources.get(its).getResourceName())) 
                packagesViewItem.getResourcesItem().setText(resources.get(its).getResourceName());
                packagesViewItem.getResourcesItem().setSelected(true);
            

            //add the view item layout to adapter container
            recyclerViewHolder.resourceItemsLayout.addView(packagesViewItem);
        //for end
    //populateResourcesItems ends

这是我在回收站视图布局中的线性布局:

            <LinearLayout
            android:weightSum="1"
            android:background="@color/colorPrimary"
            android:id="@+id/resourceItemsLayout"
            android:layout_
            android:layout_
            android:layout_above="@id/subscribeButton"
            android:layout_below="@+id/resourcesTitle"
            android:layout_marginStart="@dimen/_20sdp"
            android:layout_marginTop="@dimen/_5sdp"
            android:layout_marginEnd="@dimen/_20sdp"
            android:layout_marginBottom="@dimen/_20sdp"
            android:orientation="horizontal" />

这是我的类来填充框架布局内的视图:

public class PackagesViewItem extends FrameLayout 

    private LinearLayout resourcesViewItemLayout;
    private TextView resourcesItem;

    @SuppressLint("InflateParams")
    public PackagesViewItem(@NonNull Context context) 
        super(context);
        resourcesViewItemLayout = (LinearLayout) LayoutInflater.from(context).inflate(
                R.layout.layout_packages_view_item, null);

        resourcesItem = (TextView) resourcesViewItemLayout.findViewById(R.id.resourcesItem);
        this.addView(resourcesViewItemLayout);
    //constructor ends

    public LinearLayout getResourcesViewItemLayout() 
        return resourcesViewItemLayout;
    

    public void setResourcesViewItemLayout(LinearLayout resourcesViewItemLayout) 
        this.resourcesViewItemLayout = resourcesViewItemLayout;
    

    public TextView getResourcesItem() 
        return resourcesItem;
    

    public void setResourcesItem(TextView resourcesItem) 
        this.resourcesItem = resourcesItem;
    
//class ends

这个视图项类的布局是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/resourcesViewItemLayout"
    android:layout_
    android:layout_
    android:orientation="horizontal">

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:background="@color/packagesTabTextColorUnselected">

        <TextView
            android:id="@+id/resourcesItem"
            android:layout_
            android:layout_
            android:fontFamily="@font/opensans_regular"
            android:gravity="center"
            android:includeFontPadding="false"
            android:text="@string/mobile_bundles_resources"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/_12ssp"
            android:visibility="visible" />
    </LinearLayout>

</LinearLayout>

问题在于,当项目是单个 textview 时,它没有填充父项,请参见此处:

我想实现这样的盒子:

【问题讨论】:

【参考方案1】:

在您的 LinearLayout 中删除 android:weightSum="1" 并定义此 LinearLayout.LayoutParams

    val linearLayout : LinearLayout = findViewById(R.id.layout)
    val lp = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT)
    lp.weight = 1f

然后只应用到布局中添加的视图:

    val textView : TextView = TextView(context)
    textView.setText("Text1")
    textView.height = ...
    //...

    val textView2 : TextView = TextView(context)
    textView2.setText("Text2")
    textView2.height = ...
    //....

    linearLayout.addView(textView, lp)
    linearLayout.addView(textView2, lp)

【讨论】:

【参考方案2】:

您的代码中有很多问题,但问题是关于不需要的边距,所以...

不要设置它们

        android:layout_marginStart="@dimen/_20sdp"
        android:layout_marginTop="@dimen/_5sdp"
        android:layout_marginEnd="@dimen/_20sdp"
        android:layout_marginBottom="@dimen/_20sdp"

同时删除 android:weightSum="1" 并为创建的 TextViews 设置权重,就像 Gabriele Mariotti 建议的那样

【讨论】:

以上是关于将 TextView 动态水平添加到等权线性布局的主要内容,如果未能解决你的问题,请参考以下文章

android 界面布局实现

Android水平线性布局 - 包装元素[重复]

水平线性布局中两个文本视图的不同重力

Android开发之动态添加控件

TextView能否实现图片在左边,文字在右边,并且水平居中?

在android中的类内的对话框片段的线性布局中添加textview