9

W moich układów xml Mam widok niestandardowy, w którym będę umieścić niektóre dzieci jak:android: jak dodać dzieci z układu xml do widoku niestandardowego

<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> 

Pozwól mi wyjaśnić nieco więcej. Napisałem niestandardowy ScrollView, w którym mam zdefiniowany kontener dla dzieci. Więc po prostu chcę je tam umieścić.

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 ... 
} 

Jaki jest sposób na dodanie Child * do llContainer?

+0

można dodać trochę więcej opisu takiego pliku CustomView.xml i jego właściwości – Raj

+0

nie mam xml dla CustomView widok niestandardowy jest klasa, w której wszystko odbywa się programowo – sebataz

+0

trzeba dodać, w jaki sposób dodać widoków do układu – triggs

Odpowiedz

10

Dlaczego po prostu nie dodasz wszystkich dzieci do LinearLayout z Twojego ScrollLayout? Należy to zrobić w metodzie onFinishInflate().

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

Po napisaniu struktury w pliku XML - wszystkie widoki wewnętrzne są elementami podrzędnymi układu niestandardowego. Po prostu zamień go na LinearLayout.

+0

Próbowałem jak mówisz, ale hrabia dziecko jest zawsze 0 – sebataz

+1

przyczyną nazwać 'super.removeAllViews();' - usunąć ten ciąg – Jin35

+0

samo bez tej linii ... to może być dlatego umieściłem twój kod w 'init()'? – sebataz

6

odpowiedź Jin35 zawiera poważny problem: Wartość getChildCount() zmian na przestrzeni iteracji ponieważ usuwamy dzieci.

ten powinien być lepszym rozwiązaniem:

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

Otrzymuję 'StackOverflowException', kiedy to zrobić. – howettl

+0

@howettl Jeśli otrzymujesz od 'szanse StackOverflowException' jesteś zrobił to, co zrobiłem i próbował przesunąć widok w jednym ze swoich dzieci. – GHC

3

zgadzam odpowiedź Jin35 jest wadliwa. Dodaje się także svContainer, więc nie możemy kontynuować dopóki getChildCount() == 0.

Pod koniec init(), getChildCount() == 1, ponieważ svContainer został dodany, ale TextView nie ma. Pod koniec onFinishInflate(), gdy TextView zostały dodane i powinny być w pozycjach 1, 2, 3, 4 i 5. Ale jeśli następnie usunąć widok w pozycji 1, indeksy inni będą cały spadek o 1 (standardowe zachowanie listy).

Proponuję:

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    View v; 
    while ((v = getChildAt(1)) != null) { 
     removeView(v); 
     llContainer.addView(v); 
    } 
}