È assolutamente possibile e consigliato creare viste container personalizzate. Questo è ciò che Android chiamerebbe un controllo composto. Quindi:
public class MyCustomView extends RelativeLayout {
private LinearLayout mContentView;
public MyCustomView(Context context) {
this(context, null);
}
public MyCustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//Inflate and attach your child XML
LayoutInflater.from(context).inflate(R.layout.custom_layout, this);
//Get a reference to the layout where you want children to be placed
mContentView = (LinearLayout) findViewById(R.id.content);
//Do any more custom init you would like to access children and do setup
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if(mContentView == null){
super.addView(child, index, params);
} else {
//Forward these calls to the content view
mContentView.addView(child, index, params);
}
}
}
è possibile ignorare il maggior numero di versioni di addView()
come si sente sono necessarie, ma alla fine tutti hanno chiamata indietro alla versione ho inserito nel campione. Sostituendo solo questo metodo, il framework passerà tutti i child trovati all'interno del suo tag XML in un contenitore figlio specifico.
e quindi modificare il XML in quanto tale:
res/layout/custom_layout.xml
<merge>
<SomeView />
<SomeOtherView />
<!-- maybe more layout stuff here later -->
<LinearLayout
android:id="@+id/content" />
</merge>
La ragione per usare <merge>
è quello di semplificare la gerarchia. Tutte le visualizzazioni figlio verranno allegate alla classe personalizzata, che è un RelativeLayout
. Se non si utilizza <merge>
, si finisce con un RelativeLayout
collegato a un altro RelativeLayout
collegato a tutti i bambini, che può causare problemi.
HTH
non è la soluzione, perché ho detto che voglio definire i figli altrove (non nella visualizzazione personalizzata). Più esattamente: ho i file di layout a.xml, b.xml, c.xml: tutti utilizzano la stessa vista personalizzata, ma con diversi bambini nel LinearLayout. – mreichelt
Anche questo è perfettamente accettabile, e direi che il metodo più semplice sarebbe quello di sovrascrivere 'addView()' come descritto. Ho modificato l'esempio sopra. – Devunwired
Grazie! È bello vedere questi problemi risolti anche dopo tanto tempo! :) – mreichelt