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:
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); }
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.
Pour en savoir plus sur ce sujet, consultez l'article de blog Optimiser avec des bouchons.