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