Горизонтальное добавление текстовых представлений в линейный макет с одинаковым весом динамически

#java #android #android-layout #android-linearlayout #android-framelayout

#java #Android #android-layout #android-linearlayout #android-framelayout

Вопрос:

Я изучаю Android для своего собственного, для этого я хочу динамически добавлять текстовые представления в линейный макет с равными весами для expample:

textview1 textview2 (и так далее)

но если есть только один textview, он должен заполнить родительский элемент, то есть он должен соответствовать родительскому элементу, и если есть два элемента, то они должны наполовину заполнить родительский элемент для каждого элемента!

итак, это мой метод заполнения внутри представления recycler для динамического заполнения линейного макета текстовыми представлениями:

 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_width="match_parent"
            android:layout_height="match_parent"
            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" />
  

вот мой класс для заполнения представлений внутри framelayout:

 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_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@color/packagesTabTextColorUnselected">

        <TextView
            android:id="@ id/resourcesItem"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            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" и установите вес для созданных TextView файлов, как предложил Габриэле Мариотти