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

Author: Shruti, 2010-07-07

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

 18
Author: Yoni Samlan,
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:

  1. Utwórz inflater:

    LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  2. Nadmuchać układ dziecka:

    View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  3. Dodaj go do rodzica:

    parentLayout.addView(childLayout);
    
Zrobione, smacznego!
 66
Author: acoustic,
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