Android programowo zawierać layout (tzn. bez XML)
Więc utworzyłem podklasę aktywności o nazwie CustomTitlebarActivity. Zasadniczo każda główna aktywność w mojej aplikacji będzie miała niestandardowy pasek tytułu z wieloma wspólnymi funkcjami, takimi jak przycisk Home, tytuł, przycisk wyszukiwania itp. W mojej obecnej implementacji nadal jawnie używam instrukcji include w układzie XML dla każdego CustomTitlebarActivity:
<include layout="@layout/titlebar" />
Wydaje się naturalne, że powinienem być w stanie to zrobić w ramach CustomTitlebarActivity. Mam dwa pytania: Co kod może zastąpić ten tag include, a gdzie umieścić kod? (Moim pierwszym instynktem byłoby umieszczenie go w metodzie Setcontentview CustomTitlebarActivity.)
W związku z tym, byłbym wdzięczny za wgląd w lepsze sposoby ponownego użycia kodu interfejsu Androida (nawet jeśli, per se, paski tytułowe muszą się nieznacznie różnić między działaniami.)
2 answers
Osobiscie pewnie napisze Moja Activity
podklasa to always setContentView
do pliku layoutu zawierającego pionowy fill_parent
LinearLayout
zawierający tylko mój pasek tytułu: -
<LinearLayout android:id="@+id/custom_titlebar_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--titlebar here-->
</LinearLayout>
Następnie zdefiniowałbym metodę abstrakcyjną getContentAreaLayoutId()
w CustomTitlebarActivity
, która zwraca układ ID
zawartości pod paskiem tytułowym dla każdej podklasy; baza onCreate()
z CustomTitlebarActivity
wywoła
setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));
Alternatywnie, możesz mieć swoją abstrakcyjną metodę uzyskiwania obszaru zawartości zwracającego View
zamiast int
, dając masz większą elastyczność w dynamicznym konstruowaniu swoich widoków (ale zmuszając cię do samodzielnego nadmuchiwania ich w prostym po prostu zrzuć ten układ XML tutaj ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 16:22:58
Ja też spotkałem się z tym problemem i właśnie go rozwiązałem. Myślę, że moje rozwiązanie jest łatwiejsze:
-
Utwórz inflater:
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
-
Nadmuchać układ dziecka:
View childLayout = inflater.inflate(R.layout.child, (ViewGroup) findViewById(R.id.child_id));
-
Dodaj go do rodzica:
parentLayout.addView(childLayout);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 14:18:18