web-dev-qa-db-fra.com

Android inclut la mise en page par programmation (c'est-à-dire sans XML)

J'ai donc créé une sous-classe d'activité appelée CustomTitlebarActivity. Essentiellement, chaque activité principale de mon application aura une barre de titre personnalisée avec de nombreuses fonctionnalités communes telles qu'un bouton d'accueil, un titre, un bouton de recherche, etc. Dans mon implémentation actuelle, j'utilise toujours explicitement une instruction include dans le XML de mise en page pour chaque CustomTitlebarActivity:

<include layout="@layout/titlebar" />

Il semble naturel que je puisse le faire dans CustomTitlebarActivity. J'ai deux questions: quel code peut remplacer cette balise include et où dois-je mettre le code? (Mon premier réflexe serait de le mettre dans la méthode setContentView de CustomTitlebarActivity.)

Sur une note connexe, j'apprécierais un aperçu de meilleures façons de réutiliser Android UI code (même si, en soi, les barres de titre doivent varier légèrement entre les activités.)

35
Jon Willis

Personnellement, j'écrirais probablement ma sous-classe Activity pour toujours setContentView dans un fichier de mise en page contenant une verticale fill_parentLinearLayout contenant uniquement ma barre de titre: -

<LinearLayout Android:id="@+id/custom_titlebar_container"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
   <!--titlebar here-->
</LinearLayout>

Ensuite, je définirais une méthode abstraite getContentAreaLayoutId() dans CustomTitlebarActivity qui renvoie la disposition ID du contenu sous la barre de titre pour chaque sous-classe; la base onCreate() de CustomTitlebarActivity appellerait alors simplement

setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));

Alternativement, vous pourriez avoir votre méthode abstraite pour obtenir la zone de contenu renvoyer un View plutôt qu'un int, vous donnant plus de flexibilité pour construire vos vues dynamiquement (mais vous obligeant à les gonfler vous-même dans le simple il suffit de vider cette disposition XML ici cas).

18
Yoni Samlan

J'ai aussi rencontré ce problème et je viens de le résoudre maintenant. Je pense que ma solution est plus simple:

  1. créer un gonfleur:

    LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  2. gonfler la disposition enfant:

    View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  3. ajoutez-le au parent:

    parentLayout.addView(childLayout);
    

C'est fait, profitez-en!

59
acoustic