Aufrufe bei Bedarf laden

Manchmal erfordert Ihr Layout komplexe Ansichten, die nur selten verwendet werden. Geben Sie an, Elemente wie Artikeldetails, Fortschrittsanzeigen oder die Rückgängigmachung von Nachrichten sind, die Arbeitsspeichernutzung und das Rendern beschleunigen, indem die Ansichten nur geladen werden, wenn sie erforderlich.

Sie können das Laden von Ressourcen aufschieben, wenn Sie komplexe Ansichten haben, die Ihre App in der Zukunft benötigen, indem Sie eine ViewStub für und selten verwendete Ansichten.

ViewStub definieren

ViewStub ist eine einfache Ansicht ohne Dimension, die etwas zeichnen oder am Layout mitwirken. Daher sind nur wenige Ressourcen in einer Ansichtshierarchie zu bleiben. Jede ViewStub enthält das Attribut android:layout, um das Layout anzugeben, für das die Inflation ausgeführt werden soll.

Angenommen, Sie möchten ein Layout später in der User Journey laden, 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>

Sie können das Laden mit dem folgenden ViewStub verschieben. Um alles anzuzeigen oder zu laden, müssen Sie dafür sorgen, dass das referenzierte Layout angezeigt wird:

<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 generieren in etwa 1.

<ph type="x-smartling-placeholder">
</ph> Bild eines leeren Bildschirms <ph type="x-smartling-placeholder">
</ph> Abbildung 1: Ausgangsstatus des Bildschirms: ViewStub ist sodass das schwere Layout ausgeblendet wird.

Wenn Sie das von ViewStub angegebene Layout laden möchten, entweder durch Aufrufen von setVisibility(View.VISIBLE) oder anrufen inflate()

Das folgende Code-Snippet simuliert einen verzögerten Ladevorgang. Der Bildschirm wird geladen als normalerweise in Activity und onCreate(), dann wird sie angezeigt. heavy_layout_we_want_to_postpone-Layout:

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);
}
<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> Abbildung 2: Das kräftige Layout ist sichtbar.
<ph type="x-smartling-placeholder">

Sobald es sichtbar oder aufgebläht ist, ist das ViewStub-Element nicht mehr Teil der Ansichtshierarchie. Es wird durch das aufgeblähte Layout und die ID für die Stammansicht dieses Layouts wird durch die android:inflatedId von ViewStub. Die angegebene ID android:id für die ViewStub ist nur gültig bis zum ViewStub sichtbar oder zu groß ist.

<ph type="x-smartling-placeholder">

Weitere Informationen zu diesem Thema finden Sie im Blogpost. Optimieren mit Stubs.