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