Aufrufe bei Bedarf laden

Manchmal erfordert Ihr Layout komplexe Ansichten, die selten verwendet werden. Unabhängig davon, ob es sich um Elementdetails, Fortschrittsanzeigen oder Nachrichten zum Rückgängigmachen handelt, können Sie die Arbeitsspeichernutzung reduzieren und das Rendering beschleunigen, da die Ansichten nur bei Bedarf geladen werden.

Sie können das Laden von Ressourcen verschieben, wenn Sie komplexe Ansichten haben, die Ihre Anwendung in Zukunft benötigt. Definieren Sie dazu eine ViewStub für komplexe und selten verwendete Ansichten.

ViewStub definieren

ViewStub ist eine vereinfachte Ansicht ohne Dimensionen, die nichts zeichnet oder Teil des Layouts ist. Daher sind nur wenige Ressourcen erforderlich, um sich aufzublähen und in einer Ansichtshierarchie zu belassen. Jedes ViewStub-Element enthält das Attribut android:layout, um das Layout anzugeben, das erhöht werden soll.

Angenommen, Sie haben ein Layout, das Sie später in der User Journey Ihrer App laden möchten:

<?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>

Sie können den Ladevorgang mit der folgenden ViewStub verschieben. Damit etwas angezeigt oder geladen werden kann, muss es das referenzierte Layout anzeigen:

<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>

ViewStub-Layout laden

Die Code-Snippets im vorherigen Abschnitt erzeugen in etwa Abbildung 1:

Ein Bild eines leeren Bildschirms
Abbildung 1: Anfangszustand des Bildschirms: ViewStub verdeckt das umfangreiche Layout.

Wenn Sie das von ViewStub angegebene Layout laden möchten, legen Sie es entweder durch Aufrufen von setVisibility(View.VISIBLE) als sichtbar fest oder rufen Sie inflate() auf.

Das folgende Code-Snippet simuliert ein verschobenes Laden. Der Bildschirm wird wie gewohnt in Activity und onCreate() geladen. Dann wird das Layout heavy_layout_we_want_to_postpone angezeigt:

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);
}
Abbildung 2. Das umfangreiche Layout ist sichtbar.

Wenn das ViewStub-Element sichtbar oder aufgebläht ist, ist es nicht mehr Teil der Ansichtshierarchie. Es wird durch das überhöhte Layout ersetzt. Die ID für die Stammansicht dieses Layouts wird durch das Attribut android:inflatedId von ViewStub angegeben. Die für ViewStub angegebene ID android:id ist nur gültig, bis das Layout ViewStub sichtbar oder aufgebläht ist.

Weitere Informationen zu diesem Thema finden Sie im Blogpost Mit Stubs optimieren.