2010-07-07 13 views
26

Stworzyłem więc podklasę Działanie o nazwie CustomTitlebarActivity. Zasadniczo każde główne działanie w mojej aplikacji będzie miało niestandardowy pasek tytułu z wieloma typowymi funkcjami, takimi jak przycisk strony głównej, tytuł, przycisk wyszukiwania itp. W mojej obecnej implementacji nadal wyraźnie używam instrukcji include w układzie XML dla każdy CustomTitlebarActivity:Android programowo zawiera układ (tzn. Bez XML)

<include layout="@layout/titlebar" /> 

wydaje się naturalne, że powinienem być w stanie to zrobić w ciągu CustomTitlebarActivity. Mam dwa pytania: jaki kod może zastąpić ten znacznik i gdzie powinienem umieścić kod? (Moim pierwszym instynktem byłoby umieszczenie go w metodzie setContentView CustomTitlebarActivity).

Chciałbym poznać lepszy sposób ponownego wykorzystania kodu Androida UI (nawet jeśli per se, paski tytułowe muszą się nieco różnić między sobą). działania).

Odpowiedz

14

Osobiście bym pewnie napisać Activity podklasa zawsze setContentView do pliku zawierającego układ pionowy fill_parentLinearLayout zawierające tylko mój pasek tytułowy: -

<LinearLayout android:id="@+id/custom_titlebar_container" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <!--titlebar here--> 
</LinearLayout> 

Potem zdefiniować abstrakcyjną getContentAreaLayoutId() spełnione hod w CustomTitlebarActivity, który zwraca układ ID treści poniżej paska tytułowego dla każdej podklasy; baza onCreate() z CustomTitlebarActivity będzie wtedy po prostu zadzwoń

setContentView(R.layout.custom_titlebar_activity_frame_from_above); 
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container)); 

Alternatywnie, można mieć swój abstrakcyjny metodę uzyskiwania obszar zawartość zwrócić View raczej niż int, co daje większą elastyczność, aby zbudować swoje poglądy dynamicznie (ale zmuszając nadmuchać je samodzielnie w prosty po prostu zrzucić ten układ XML tutaj przypadku).

+0

Ta konfiguracja załatwiła sprawę, eksperymentuję z nią więcej. Jakieś dobre pomysły na to, jak pozwolić na różne rozmieszczenie przycisków akcji na tym pasku tytułowym? –

+0

To zależy, ale jeśli istnieje ograniczona liczba dość przewidywalnych dostosowań (jeden lub dwa niestandardowe przyciski/akcje), prawdopodobnie utknęłbym w "abstrakcyjnej metodzie zastąpionej przez podklasy, aby uzyskać obraz do użycia i działania" (np. streszczenie getFirstActionImageResourceId(), onFirstActionClicked()) i po prostu podłącz je do klasy onCreate() klasy podstawowej. –

49

Ten problem również spotkałem i właśnie go rozwiązałem. Myślę, że moje rozwiązanie jest łatwiejsze:

  1. stworzyć inflater:

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

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

    parentLayout.addView(childLayout); 
    

Skończyło się, ciesz się!

+1

Dokładna odpowiedź dla

+7

Myślę, że powinna to być 'findViewById (R.id.child_id));' not 'R.layout.child_id' – Ranjit

+0

Kiedy to robię, szerokości nie wydają się pozostać tak, jak to zdefiniowano w układzie. Nie wiem dlaczego –

Powiązane problemy