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">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); }
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.
Weitere Informationen zu diesem Thema finden Sie im Blogpost. Optimieren mit Stubs.