Динамическое добавление содержимого в линейный макет?

79

Если, например, я определил корневой линейный макет с вертикальной ориентацией:

main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/my_root"
      android:layout_height="wrap_content"
      android:layout_width="fill_parent"
      android:orientation="vertical"

    <!-- I would like to add content here dynamically.-->

</LinearLayout>

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

Например, root с дочерним макетом, таким как:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/my_root"
      android:layout_height="wrap_content"
      android:layout_width="fill_parent"
      android:orientation="vertical"

    <!-- 1st child (1st row)-->
    <LinearLayout 
        ...
       android:orientation="horizontal">

          <TextView .../>
          <TextView .../>
          <TextView .../>
    </LinearLayout>

     <!-- 2nd child (2nd row)-->
     ...
</LinearLayout>

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

Как можно программно добавить второй макет к первому, который также может установить все атрибуты макета для каждого дочернего элемента и добавить другие элементы внутри дочернего элемента?

Leem
источник

Ответы:

102

В своем onCreate()напишите следующее

LinearLayout myRoot = (LinearLayout) findViewById(R.id.my_root);
LinearLayout a = new LinearLayout(this);
a.setOrientation(LinearLayout.HORIZONTAL);
a.addView(view1);
a.addView(view2);
a.addView(view3);
myRoot.addView(a);

view1, view2и view3ваши TextViews. Их легко создать программно.

Шериф Эль-Хатиб
источник
5
Кто-нибудь знает, почему это так? Почему я не могу просто сделать this.addView (view1), если это расширяет LinearLayout?
MegaWidget
Хорошо, но когда мне следует использовать это, а когда лучше использовать TableLayout? Это просто вопрос личного вкуса?
Зерато
мы также должны добавить линейный макет в динамический horizontalScrollView. tnx:)
SemyColon.Me
77
LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
View child = getLayoutInflater().inflate(R.layout.child, null);
layout.addView(child);
gregory561
источник
1
Если мы это сделаем. Как нам удается обрабатывать события щелчка внутри "layout.child"?
Малинду
3
@Warapitiy Используется child.findViewByIdдля получения элемента и установки прослушивателя onclick.
Choxmi
5

Вы можете добиться каскадирования LinearLayout следующим образом:

LinearLayout root = (LinearLayout) findViewById(R.id.my_root);    
LinearLayout llay1 = new LinearLayout(this);    
root.addView(llay1);
LinearLayout llay2 = new LinearLayout(this);    
llay1.addView(llay2);
Баладжи Хадаке
источник
0

Я нашел более точный способ добавления представлений, таких как линейные макеты в kotlin (передать родительский макет в inflate () и false)

val parentLayout = view.findViewById<LinearLayout>(R.id.llRecipientParent)
val childView = layoutInflater.inflate(R.layout.layout_recipient, parentLayout, false)
parentLayout.addView(childView)
Баджранг Худда
источник