Charger des vues à la demande

Parfois, votre mise en page nécessite des vues complexes qui sont rarement utilisées. Qu'il s'agisse de détails sur des éléments, d'indicateurs de progression ou de messages d'annulation, vous pouvez réduire l'utilisation de la mémoire et accélérer l'affichage en ne chargeant les vues que lorsque cela est nécessaire.

Vous pouvez différer le chargement des ressources lorsque vous avez des vues complexes dont votre application aura besoin à l'avenir. Pour ce faire, définissez un ViewStub pour les vues complexes et rarement utilisées.

Définir un ViewStub

ViewStub est une vue légère sans dimension qui ne dessine rien et ne participe pas à la mise en page. Par conséquent, il faut peu de ressources à gonfler et à laisser dans une hiérarchie des vues. Chaque ViewStub inclut l'attribut android:layout pour spécifier la mise en page à gonfler.

Supposons que vous souhaitiez charger une mise en page ultérieurement dans le parcours utilisateur de votre application:

<?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:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

Vous pouvez reporter le chargement à l'aide des ViewStub suivants. Pour qu'elle affiche ou charge quelque chose, vous devez afficher la mise en page référencée:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/heavy_layout_we_want_to_postpone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
</FrameLayout>

Charger la mise en page ViewStub

Les extraits de code de la section précédente produisent un résultat semblable à la figure 1:

Image d&#39;un écran vide
Image 1. État initial de l'écran: ViewStub masque la mise en page lourde.

Lorsque vous souhaitez charger la mise en page spécifiée par ViewStub, définissez-la comme visible en appelant setVisibility(View.VISIBLE) ou en appelant inflate().

L'extrait de code suivant simule un chargement différé. L'écran se charge comme d'habitude dans Activity et onCreate(), puis affiche la mise en page heavy_layout_we_want_to_postpone:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_old_xml)

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000)
}

Java

@Override
void onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_old_xml);

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000);
}
Figure 2 : La mise en page épaisse est visible.

Une fois visible ou gonflé, l'élément ViewStub ne fait plus partie de la hiérarchie des vues. Elle est remplacée par la mise en page gonflée, et l'ID de la vue racine de cette mise en page est spécifié par l'attribut android:inflatedId de ViewStub. L'ID android:id spécifié pour ViewStub n'est valide que jusqu'à ce que la mise en page ViewStub soit visible ou gonflée.

Pour en savoir plus à ce sujet, consultez l'article de blog Optimiser avec des bouchons.