9

Nei miei schemi XML ho una visualizzazione personalizzata in cui mi metterò alcuni bambini come:Android: come aggiungere i bambini da un layout XML in una visualizzazione personalizzata

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

Mi spiego un po 'di più. Ho scritto una ScrollView personalizzata in cui ho già definito un contenitore, per i bambini. Quindi voglio solo metterli li '.

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

Qual è il modo per aggiungere Bambino * a llContainer?

+0

si può aggiungere un po 'di più come descrizione del file CustomView.xml e le sue proprietà – Raj

+0

non ho un XML per il CustomView la visualizzazione personalizzata è una classe in cui tutto è fatto a livello di codice – sebataz

+0

È necessario aggiungere come si aggiungono le viste al proprio layout – triggs

risposta

10

Perché non aggiungete tutti i bambini allo LinearLayout dal vostro ScrollLayout? Questo dovrebbe essere fatto nel metodo onFinishInflate().

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

Quando si scrive la tua struttura in file XML - tutte le viste interne sono figli di tuo layout personalizzato. Basta sostituirlo con LinearLayout.

+0

ho provato come dici tu, ma il conteggio dei bambini è sempre 0 – sebataz

+1

perchè chiami 'super.removeAllViews();' - rimuovi questa stringa – Jin35

+0

lo stesso senza quella linea ... potrebbe essere perché ho messo il tuo codice all'interno di 'init()'? – sebataz

6

La risposta di Jin35 ha un problema serio: getChildCount() modifica il valore rispetto alle iterazioni perché stiamo rimuovendo i bambini.

Questa dovrebbe essere una soluzione migliore:

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

Ottengo un 'StackOverflowException' quando faccio questo. – howettl

+0

@howettl Se stai ottenendo una probabilità 'StackOverflowException', hai fatto quello che ho fatto e ho provato a spostare una vista in uno dei suoi figli. – GHC

3

Concordo risposta di Jin35 è viziata. Inoltre, svContainer viene aggiunto, quindi non possiamo continuare fino a getChildCount() == 0.

Alla fine di init(), getChildCount() == 1, poiché svContainer è stato aggiunto ma TextViews no. Alla fine di onFinishInflate(), le TextViews sono state aggiunte e dovrebbero essere nelle posizioni 1, 2, 3, 4 e 5. Ma se si rimuove la vista in posizione 1, gli indici degli altri diminuiranno di 1 (comportamento elenco standard).

vorrei suggerire:

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

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