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:
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); }
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).