Wczytaj wyświetlenia na żądanie

Czasami układ wymaga złożonych widoków, które są rzadko używane. Niezależnie od tego, czy chodzi o szczegóły elementu, wskaźniki postępu czy cofanie wiadomości, możesz zmniejszyć użycie pamięci i przyspieszyć renderowanie, ładując widoki tylko wtedy, gdy są potrzebne.

Jeśli Twoja aplikacja potrzebuje w przyszłości złożonych widoków, możesz opóźnić wczytywanie zasobów. W tym celu zdefiniuj właściwość ViewStub na potrzeby złożonych i rzadko używanych widoków.

Zdefiniuj widok Stub

ViewStub to uproszczony widok bez wymiarów, który niczego nie rysuje ani nie uczestniczy w układzie. Potrzeba więc niewielu zasobów, aby sztucznie zawyżać dane i zostawiać je w hierarchii widoków. Każdy element ViewStub zawiera atrybut android:layout określający układ do nadania.

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

<?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 przy użyciu elementu ViewStub. Aby coś się wyświetlało lub ładowało, musisz włączyć w nim wyświetlanie odsyłającego 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

Z fragmentów kodu z poprzedniej sekcji dowiesz się, jak wygląda to na ilustracji 1:

Obraz pustego ekranu
Rysunek 1. Początkowy stan ekranu: ViewStub ukrywa układ złożony.

Gdy chcesz wczytać układ określony przez ViewStub, ustaw go jako widoczny, wywołując setVisibility(View.VISIBLE) lub wywołując inflate().

Ten fragment kodu symuluje odłożone obciążenie. Ekran wczytuje się tak jak zwykle w Activity i onCreate(), a potem pokazuje 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 układ zgrubiony.

Po wyświetleniu lub powiększeniu element ViewStub przestaje być częścią hierarchii widoków. Zastępuje go powiększony układ, a identyfikator widoku głównego tego układu jest określany w atrybucie android:inflatedId elementu ViewStub. Identyfikator android:id określony dla elementu ViewStub jest ważny tylko wtedy, gdy układ ViewStub nie będzie widoczny lub powiększony.

Więcej informacji na ten temat znajdziesz w poście na blogu Optimize with stubs (Optymalizacja za pomocą namiastek).