Charger des vues à la demande

Parfois, votre mise en page nécessite des vues complexes rarement utilisées. Que les détails des éléments, les indicateurs de progression ou les messages d'annulation, vous pouvez réduire de la mémoire et accélérer le rendu en chargeant les vues uniquement lorsqu'elles nécessaires.

Vous pouvez différer le chargement des ressources lorsque vous disposez de vues complexes que votre application besoins futurs en définissant ViewStub pour complexes et rarement utilisées.

Définir un ViewStub

ViewStub est une vue légère sans dimension dessiner quelque chose ou participer à la mise en page. Il nécessite donc peu de ressources de gonfler et de conserver une hiérarchie des vues. Chaque ViewStub inclut L'attribut android:layout pour spécifier la mise en page à gonfler

Supposons que vous ayez une mise en page que vous souhaitez charger plus tard 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 du ViewStub suivant. Pour il affiche ou charge quoi que ce soit, vous devez faire en sorte qu'elle affiche la mise en page mentionné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 une représentation 1:

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

Lorsque vous souhaitez charger la mise en page spécifiée par ViewStub, procédez comme suit : vous pouvez soit la définir comme visible en appelant setVisibility(View.VISIBLE) ou appelez inflate()

L'extrait de code suivant simule un chargement différé. L'écran se charge en tant que d'habitude dans Activity et onCreate(), il s'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 en gras est visible.
<ph type="x-smartling-placeholder">

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

<ph type="x-smartling-placeholder">

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