Carica visualizzazioni on demand

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:

L&#39;immagine di uno schermo vuoto
Figura 1. Stato iniziale della schermata: ViewStub nasconde il layout pesante.

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);
}
Figura 2. Il layout pesante è visibile.

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.