Невозможно исправить добавление ребенка в LinearLayout

У меня простая задача - динамически добавить дочерние представления в LinearLayout, но я не знаю, как это сделать правильно.

Есть два способа:

<сильный>1. Раздувание представления и передача родительского контейнера методу раздувания.

View view = LayoutInflater.from(getActivity()).inflate(R.layout.item, container, true);

В этом случае, когда у меня более одного дочернего элемента, LayoutInfater каждый раз возвращает один и тот же дочерний объект представления при его раздувании. Поэтому я могу правильно инициализировать другие дочерние представления.

<сильный>2. Следующий способ — использовать метод LinearLayout addView(View view).

Проблема в том, что дочернее представление теряет состояние LayoutParams. И я должен программно установить новые LayoutParams для дочерних элементов. Это не очень хорошая практика.

Также мы можем поместить дочерний макет в комплиментарную оболочку в его собственном файле ресурсов макета. Но также не рекомендуется помещать макет в обертку.

Мой дочерний ресурс:

<RelativeLayout android:gravity="center_vertical"
            android:paddingLeft="25dp"
            android:layout_width="match_parent"
            android:layout_height="@dimen/list_item_height">

<TextView android:id="@+id/tv_name"
          android:text="Name"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>

So what is the proper way to add child to LinearLayout, without adding LayoutParams programmatically and without wrapper layout?

Большое спасибо за помощь!


person harmashalex    schedule 11.08.2015    source источник
comment
Вы можете проверить вопрос. Вопрос имеет линейную компоновку в качестве родителя и добавляет tableLayout в качестве дочерних представлений. stackoverflow.com/questions/31847066/   -  person Saritha G    schedule 11.08.2015
comment
В этом примере корневой дочерний макет не имеет настраиваемых параметров макета. (например, фиксированная layout_width или layout_height)   -  person harmashalex    schedule 11.08.2015
comment
Вы хотите исправить ширину и высоту дочернего представления ?? или не хочешь исправлять? Линейная компоновка — это корневая компоновка, и она не является пользовательской.   -  person Saritha G    schedule 11.08.2015
comment
stackoverflow.com/ вопросы/2335813/   -  person IntelliJ Amiya    schedule 11.08.2015
comment
Когда корневой макет вашего дочернего элемента имеет, например, layout_height=50dp, поэтому, когда вы добавляете этот дочерний элемент в контейнер, такой как container.addView(child), дочерний layout_height устанавливается как wrap_content, потому что это параметр LayoutParams.   -  person harmashalex    schedule 11.08.2015


Ответы (3)


Вы пробовали этот способ?

View view= LayoutInflater.from(getActivity()).inflate(R.layout.item, null, false);

parentView.addView(view);
person Adam Fręśko    schedule 11.08.2015
comment
Да, дочернее представление потеряло состояние LayoutParams. - person harmashalex; 11.08.2015
comment
Но почему вы хотите избежать создания layoutParams? Это просто. - person Adam Fręśko; 11.08.2015
comment
Я знаю, что это легко) Я спросил, потому что может быть у кого-то есть решение получше) - person harmashalex; 11.08.2015

если вы хотите добавить дочерний элемент в RelativeLayout, вам нужно установить LayoutParams для дочернего представления, и если вы хотите добавить дочерний элемент в LinerLayout, вам не нужно устанавливать LayoutParams, поэтому, если вы хотите настроить параметры layoutParams, я предлагаю вам использовать RelativeLayout, или вы можете создать представление-оболочку для дочернего представления, например:

//inflate a wrapper view
View child = LayoutInflater.from(getActivity()).inflate(R.layout.item, container, false);
//add to a linerLayout
LinerLayout.addChild(child)
person zongchao Xu    schedule 11.08.2015

Попробуйте так,

View view = LayoutInflater.from(getActivity()).inflate(R.layout.item, **container**, false);
layout.addView(view);
person Alex.Li    schedule 11.08.2015