Android propose deux méthodes pour créer un écran d’une application :
- Une méthode dynamique, se basant sur une structure de composants créés dans du code Java : les pages sont créés en assemblant des conteneurs (Layout) et des composants (Button, TextView, …). Par exemple, voilà le code pour créer un formulaire avec un texte, un input et un bouton de validation :
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout addTask = new LinearLayout(this); addTask.setOrientation(LinearLayout.HORIZONTAL); // Interface pour ajouter des tâches TextView label = new TextView(this); label.setText("new"); addTask.addView(label); newTask = new EditText(this); newTask.setWidth(100); addTask.addView(newTask); Button addButton = new Button(this); addButton.setText("add"); initButton(addButton); addTask.addView(addButton); setContentView(layout); }
- Une méthode statique, se basant sur des fichiers XML. Ici, on décrit le même genre d’éléments (conteneurs et composants) mais dans un format XML, plus convivial :
Chaque méthode a ses avantages et ses inconvénients. Par exemple, la méthode statique et plus concise et plus lisible, alors que la méthode dynamique est plus flexible (car dynamique !) mais plus abscons. C’est pourquoi il peut être utile de mélanger les deux méthodes, et ainsi obtenir des vues facilement modifiables et dynamiques !
Pour cela, deux possibilités : mettre des éléments dynamiques dans une vue statique, ou mettre des éléments statiques dans une vue dynamique.
Eléments statiques dans une vue dynamique
Le but de cette manipulation et de récupérer des vues décrites dans des fichiers XML, et de les placer où on le souhaite dans une vue créée dynamiquement. Pour le faire (et le faire bien!), il faut comprendre le système de chargement des ressources. Je ne m’étendrais pas sur le sujet (le guide de dev d’Android est assez bien fourni dessus), mais pour charger un layout autrement qu’en l’associant à la vue complète (Activity.setContentView(R.layout.*)), il est nécessaire de passer par un object LayoutInflater, qui va se charger de transformer les éléments déjà traité par le système de ressource en Object Layout exploitable.
Dans l’exemple suivant, le layout menu (créé dans le fichier XML res/layout/menu.xml) est chargé et ajouté dans un layout existant :
LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); // ... Construction du début de la page LinearLayout menu = (LinearLayout) getLayoutInflater().inflate(R.layout.menu, null); layout.addView(menu); //... Construction de la fin de la page setContentView(layout);
Eléments dynamiques dans une vue statique
Le but de cette manipulation est d’avoir une page statique représentant la structure de la page, et de la compléter avec des éléments dynamiques.
