A volte il layout richiede visualizzazioni complesse che vengono utilizzate raramente. Che si tratti di dettagli degli elementi, indicatori di avanzamento o messaggi di annullamento, puoi ridurre l'utilizzo della memoria e velocizzare il rendering caricando le visualizzazioni solo quando sono necessarie.
Puoi rimandare il caricamento delle risorse in caso di viste complesse di cui la tua app avrà bisogno in futuro definendo un ViewStub
per quelle complesse e utilizzate raramente.
Definizione di un ViewStub
ViewStub
è una visualizzazione leggera senza dimensioni che non
disegna nulla o non partecipa al layout. Di conseguenza, sono necessarie poche risorse
per gonfiare e uscire dalla gerarchia delle visualizzazioni. Ogni ViewStub
include
l'attributo android:layout
per specificare il layout da gonfiare.
Supponi di avere un layout che vuoi caricare più avanti nel percorso dell'utente della tua app:
<?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>
Puoi posticipare il caricamento utilizzando il seguente ViewStub
. Per visualizzare o caricare qualsiasi elemento, devi fare in modo che mostri il layout di riferimento:
<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>
Carica il layout ViewStub
Gli snippet di codice della sezione precedente producono un elemento simile alla figura 1:
Se vuoi caricare il layout specificato da ViewStub
, impostalo come visibile chiamando setVisibility(View.VISIBLE)
o chiamando inflate()
.
Il seguente snippet di codice simula un caricamento posticipato. La schermata viene caricata normalmente in Activity
e onCreate()
, quindi mostra il layout 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); }
Una volta visibile o aumentato in modo artificioso, l'elemento ViewStub
non fa più parte
della gerarchia delle visualizzazioni. Viene sostituito dal layout "gonfiato" e l'ID per la vista principale di quel layout è specificato dall'attributo android:inflatedId
di ViewStub
. L'ID android:id
specificato per ViewStub
è valido solo finché il layout ViewStub
non è visibile o aumentato in modo artificioso.
Per ulteriori informazioni su questo argomento, vedi il post del blog Ottimizzare con gli stub.