Wczytaj wyświetlenia na żądanie

Czasami Twój układ wymaga złożonych widoków, które są rzadko używane. Określa, czy np. szczegóły elementu, wskaźniki postępu lub cofnięcia wiadomości. wykorzystanie pamięci i przyspieszyć renderowanie, ładując widoki tylko wtedy, gdy są niezbędną.

Możesz opóźnić wczytywanie zasobów, jeśli masz złożone widoki, na przyszłość poprzez zdefiniowanie ViewStub – złożone i rzadko używane widoki.

Definiowanie obiektu ViewStub

ViewStub to prosty widok bez wymiarów, rysować, co tylko chcesz, ani uczestniczyć w układzie. Z tego względu wymaga mało zasobów, i pominąć hierarchię widoków. Każda ViewStub obejmuje w atrybucie android:layout możesz określić układ, który ma zostać powiększony.

Załóżmy, że masz układ, który chcesz wczytać na późniejszym etapie ścieżki użytkownika aplikacja:

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

Możesz opóźnić wczytywanie, używając tych elementów: ViewStub. Aby zrobić aby cokolwiek wyświetlić lub wczytać, musisz włączyć wyświetlanie odnośnego układu:

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

Wczytywanie układu ViewStub

Fragmenty kodu z poprzedniej sekcji generują coś w rodzaju „rysunek” 1.

Obraz pustego ekranu
Rysunek 1. Początkowy stan ekranu: ViewStub to ukrywanie obszernego układu.

Jeśli chcesz wczytać układ określony przez ViewStub, albo ustaw ją jako widoczne, wywołując setVisibility(View.VISIBLE) lub zadzwoń inflate()

Poniższy fragment kodu symuluje opóźnione wczytywanie. Ekran wczytuje się jako zwykle w: Activity i onCreate(), potem jest widoczna układ 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);
}
Rysunek 2. Widoczny jest obszerny układ.
.
.

Po wyświetleniu lub powiększeniu element ViewStub przestanie być częścią elementu w hierarchii widoków. Zastąpi go układ powiększony, a identyfikator elementu widok główny tego układu określa android:inflatedId atrybutu ViewStub. Podany identyfikator (android:id) dla ViewStub jest ważna tylko do ViewStub czy układ stron jest widoczny lub ma powiększony rozmiar.

Więcej informacji na ten temat znajdziesz w poście na blogu Optymalizuj z krotkami.