Dans une activité, vous pouvez créer un LinearLayout par programme de la manière suivante:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
TextView tv1 = new TextView(this);
tv1.setText("HELLO");
ll.addView(tv1);
TextView tv2 = new TextView(this);
tv2.setText("WORLD");
ll.addView(tv2);
setContentView(ll);
}
Comment faites-vous la même chose dans une sous-classe View personnalisée? Il n'y a pas de méthodes setContentView
ou onCreate
...
Ok, j'ai découvert une façon de le faire. Fondamentalement, au lieu de sous-classer directement la classe View, vous devez sous-classer la classe la plus haute que vous définiriez normalement en XML. Par exemple, si votre vue personnalisée nécessite LinearLayout en tant que classe supérieure, cette vue doit simplement sous-classer LinearLayout.
Par exemple:
public class MyCustomView extends LinearLayout
{
public MyCustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
setOrientation(LinearLayout.VERTICAL);
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
TextView tv1 = new TextView(context);
tv1.setText("HELLO");
addView(tv1);
TextView tv2 = new TextView(context);
tv2.setText("WORLD");
addView(tv2);
}
}
Sous-classer LinearLayout est-il un "hack"? Pas aussi loin que je peux voir. Certaines sous-classes officielles de View font la même chose, comme NumberPicker et SearchView (même s’ils gonflent leur mise en page à partir de XML).
Après réflexion, c'est en fait une réponse assez évidente.