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:
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); }
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.