Android: как добавить детей из макета xml в пользовательский вид

В моих макетах xml у меня есть пользовательский вид, в который я буду помещать несколько таких детей:

<com.proj.layouts.components.ScrollLayout android:id="@+id/slBody" android:layout_width="700dp" android:layout_height="400dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child1"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child3"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child4"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child5"/> </com.proj.layouts.components.ScrollLayout> 

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

 public class ScrollLayout extends LinearLayout { // View responsible for the scrolling private FrameLayout svContainer; // View holding all of the children private LinearLayout llContainer; public ScrollLayout(Context context) { super(context); init(); } public ScrollLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { super.removeAllViews(); // kill old containers svContainer = new HorizontalScroll(getContext()); llContainer = new LinearLayout(getContext()); llContainer.setOrientation(orientation); svContainer.addView(llContainer); svContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); llContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); addView(svContainer); } ... I left out the part which takes care of the scroll event ... } 

Каким образом можно добавить Child * в llContainer?

Почему бы вам просто не добавить всех детей в LinearLayout из ScrollLayout ? Это должно быть сделано в onFinishInflate() .

 for (int i = 0; i<getChildCount(); i++) { View v = getChildAt(i); removeViewAt(i); llContainer.addView(v); } 

Когда вы пишете свою структуру в XML-файле, все внутренние представления являются дочерними элементами вашего пользовательского макета. Просто замените его на LinearLayout .

Ответ Jin35 имеет серьезную проблему: getChildCount() изменяет значение по сравнению с итерациями, потому что мы удаляем дочерние элементы.

Это должно быть лучшим решением:

 while (getChildCount() > 0) { View v = getChildAt(0); removeViewAt(0); llContainer.addView(v); } 

Я согласен, что ответ Jin35 ошибочен. Кроме того, добавлен svContainer, поэтому мы не можем продолжать работу до getChildCount () == 0.

К концу init (), getChildCount () == 1, поскольку svContainer добавлен, но TextViews нет. К концу onFinishInflate () TextViews добавлены и должны быть в положениях 1, 2, 3, 4 и 5. Но если вы удалите View в позиции 1, индексы остальных уменьшатся на 1 ( Стандартное поведение List).

Я бы предложил:

 @Override protected void onFinishInflate() { super.onFinishInflate(); View v; while ((v = getChildAt(1)) != null) { removeView(v); llContainer.addView(v); } }