A volte il layout richiede visualizzazioni complesse che vengono utilizzate raramente. Indica se sono dettagli elemento, indicatori di avanzamento o annullare messaggi, puoi ridurre memoria utilizzata e velocizza il rendering caricando le visualizzazioni solo quando necessaria.
Puoi rimandare il caricamento delle risorse quando hai visualizzazioni complesse che la tua app
per soddisfare le esigenze future definendo una
ViewStub
per
viste complesse e usate raramente.
Definisci una finestra di visualizzazione
ViewStub
è una visualizzazione leggera senza dimensione
disegnare qualsiasi cosa o partecipare al layout. Di conseguenza, richiede poche risorse
a gonfiare e lasciare in una gerarchia di visualizzazione. Ogni ViewStub
include
l'attributo android:layout
per specificare il layout da aumentare in modo artificioso.
Supponi di avere un layout che vuoi caricare in un secondo momento nel percorso dell'utente del tuo dell'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 rendere
mostra o carica qualcosa, devi mostrare il layout suggerito:
<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 nella sezione precedente producono qualcosa come la figura 1:
Quando vuoi caricare il layout specificato dall'ViewStub
,
impostala su visibile chiamando
setVisibility(View.VISIBLE)
o chiama
inflate()
.
Il seguente snippet di codice simula un caricamento posticipato. La schermata viene caricata
solito in Activity
e onCreate()
, poi compare
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 gonfiato, l'elemento ViewStub
non fa più parte
della gerarchia delle viste. Viene sostituito dal layout gonfiato e dall'ID per il valore
la vista principale di quel layout sia specificata dallo android:inflatedId
di ViewStub
. L'ID android:id
specificato
per ViewStub
è valido solo fino alla ViewStub
il layout sia visibile o gonfiato.
Per ulteriori informazioni su questo argomento, vedi il post del blog Ottimizzazione con stub.