Optimiser les mises en page

 Gonfler les tracés est un processus coûteux. chaque mise en page supplémentaire imbriquée et la vue incluse ont un impact direct sur les performances et la réactivité de votre application. C'est l'une des raisons pour lesquelles Constraint Layout, avec sa capacité à aplatir la hiérarchie des vues, est fortement recommandé.

Pour que vos applications restent fluides et réactives, il est important de garder vos présentations aussi simples que possible et d'éviter de gonfler de nouvelles présentations pour les modifications d'interface utilisateur relativement réduites.

 Les conteneurs de disposition redondants sont redondants

 Une disposition linéaire dans une disposition de cadre, dont les deux sont définis sur MATCH_PARENT, ne fait que prolonger le temps nécessaire pour gonfler. Recherchez les présentations redondantes, en particulier si vous apportez des modifications importantes à une présentation existante ou si vous ajoutez des présentations enfants à une présentation existante.

Les dispositions peuvent être imbriquées arbitrairement. Il est donc facile de créer des hiérarchies complexes et profondément imbriquées. Bien qu’il n’y ait pas de limite stricte, il est judicieux de limiter la nidification à moins de 10 niveaux.

Un exemple courant d'imbrication inutile est une disposition de cadre utilisée pour créer le nœud racine unique requis pour une présentation, comme indiqué dans l'extrait de code suivant:

 < ?xml version="1.0" encoding="utf-8"? >

< FrameLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="match_parent"   android:layout_height="match_parent">

  <ImageView

    android:id="@+id/myImageView"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:src="@drawable/myimage"

  />

  <TextView

    android:id="@+id/myTextView"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:text="@string/hello"     android:gravity="center_horizontal"     android:layout_gravity="bottom"

  />

< /FrameLayout >

 Dans cet exemple, lorsque la disposition du cadre est ajoutée à un parent, elle devient redondante. Une meilleure alternative consiste à utiliser la balise de fusion:

 < ?xml version="1.0" encoding="utf-8"? >

< merge   xmlns:android="http://schemas.android.com/apk/res/android">

  <ImageView

    android:id="@+id/myImageView"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:src="@drawable/myimage"

  />

  <TextView

    android:id="@+id/myTextView"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:text="@string/hello"     android:gravity="center_horizontal"     android:layout_gravity="bottom"

  />

< /merge >

 Lorsqu'une disposition contenant une balise de fusion est ajoutée à une autre, le nœud de fusion est supprimé et ses vues enfant sont ajoutées directement au nouveau parent.

La balise de fusion est particulièrement utile en conjonction avec la balise include, qui permet d’insérer le contenu d’une mise en page dans une autre:

 < ?xml version="1.0" encoding="utf-8"? >

< LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"   android:layout_width="match_parent"   android:layout_height="match_parent">

  <include android:id="@+id/my_action_bar"                layout="@layout/actionbar"/>

  <include android:id="@+id/my_image_text_layout"                layout="@layout/image_text_layout"/> < /LinearLayout >

 La combinaison des balises de fusion et d’inclusion vous permet de créer des définitions de présentation souples et réutilisables qui ne créent pas de hiérarchies de présentation profondément imbriquées. Vous en apprendrez plus sur la création et l'utilisation de dispositions simples et réutilisables plus loin dans ce chapitre.

 Évitez d'utiliser des vues excessives

 Chaque vue supplémentaire prend du temps et des ressources à gonfler. Pour optimiser la rapidité et la réactivité de votre application, aucune de ses dispositions ne doit inclure plus de 80 vues. Lorsque vous dépassez cette limite, le temps pris pour gonfler la mise en page peut devenir important.

Pour réduire le nombre de vues gonflées dans une mise en page complexe, vous pouvez utiliser un ViewStub.

Un stub de vue fonctionne comme une inclusion paresseuse - un stub qui représente les vues enfant spécifiées dans la présentation parent - mais le stub est uniquement gonflé explicitement via la méthode inflate ou lorsqu'il est rendu visible:

 // Find the stub

View stub = findViewById(R.id.download_progress_panel_stub);

// Make it visible, causing it to inflate the child layout stub.setVisibility(View.VISIBLE);

// Find the root node of the inflated stub layout

View downloadProgressPanel = findViewById(R.id.download_progress_panel);

 Par conséquent, les vues contenues dans la disposition enfant ne sont pas créées avant qu’elles ne soient requises, ce qui permet de réduire le temps et le coût en ressources liés au gonflement des interfaces utilisateur complexes.

Lorsque vous ajoutez un talon de vue à votre mise en page, vous pouvez remplacer les paramètres id et layout de la vue racine de la mise en page qu'il représente:

 < ?xml version="1.0" encoding="utf-8"? >

< FrameLayout "xmlns:android=http://schemas.android.com/apk/res/android"

  android:layout_width="match_parent"   android:layout_height="match_parent">

  <ListView

    android:id="@+id/myListView"     android:layout_width="match_parent"     android:layout_height="match_parent"

  />

  <ViewStub     android:id="@+id/download_progress_panel_stub"

    android:layout="@layout/progress_overlay_panel"     android:inflatedId="@+id/download_progress_panel"

    android:layout_width="match_parent"     android:layout_height="wrap_content"     android:layout_gravity="bottom"

  />

< /FrameLayout >

 Cet extrait modifie la largeur, la hauteur et la gravité de la présentation importée pour répondre aux exigences de la présentation parent. Cette flexibilité permet de créer et de réutiliser les mêmes présentations enfants génériques dans une variété de présentations parents.

Un ID a été spécifié pour le stub et le groupe de vues. Il deviendra une fois gonflé en utilisant les attributs id et inflatedId, respectivement.

 Remarque Lorsque le stub de vue est gonflé, il est supprimé de la hiérarchie et remplacé par le nœud racine de la vue importée. Si vous devez modifier la visibilité des vues importées, vous devez utiliser la référence à leur nœud racine.

(renvoyé par l'appel inflate) ou recherchez la vue à l'aide de findViewById, à l'aide de l'ID de présentation qui lui est attribué dans le nœud View Stub correspondant.

 Utiliser Lint pour analyser vos mises en page

 Pour vous aider à optimiser vos hiérarchies de présentation, le SDK Android inclut Lint, un outil puissant que vous pouvez utiliser pour détecter les problèmes au sein de votre application, y compris les problèmes de performances de présentation.

L'outil Lint est disponible dans Android Studio via l'option Inspecter le code du menu Analyse, comme illustré à la figure 5-3, ou en tant qu'outil de ligne de commande.

En plus d'utiliser Lint pour détecter chaque problème d'optimisation décrit précédemment dans cette section, vous pouvez également utiliser Lint pour détecter les traductions manquantes, les ressources inutilisées, les tailles de tableau incohérentes, les problèmes d'accessibilité et d'internationalisation, les actifs d'image manquants ou dupliqués, les problèmes d'utilisation et les erreurs de manifeste.

Lint est un outil en constante évolution, avec de nouvelles règles ajoutées régulièrement.