2011-11-14 17 views
6

Czy istnieje wygodny sposób wyświetlania tych samych opcji menu Opcje w wielu działaniach?Ponowne użycie opcji Kod menu

Przykład: W mojej aplikacji wyświetlam przewodnik telewizyjny na jeden z trzech sposobów.

  1. Siedem dni prowadząca (TabActivity z 7 kart)
  2. Wszystkie kanały 'Teraz pokazuje' (ListActivity)
  3. Wszystkie pokazy dziś czas rozpoczęcia (aktywny - może być łatwo zmieniona na ListActivity)

do menu Opcje w TabActivity, kod jest dość prosty ...

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    menu.clear(); 
    inflater.inflate(R.menu.gv_options_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.view: 
     ... 
    ... 
    } 
} 

... b ut w tej chwili wydaje się, że muszę skopiować/wkleić go do dwóch pozostałych działań, które mi się nie podobają. Jeśli zmienię kod menu opcji na jeden, będę musiał to zrobić również dla pozostałych dwóch.

Jedyną alternatywą, o której mogę myśleć jest klasa "pomocnicza" (POJO), do której mogę dodać metodę i przekazać context w celu umożliwienia użycia metody getMenuInflator() i innej metody, w której mógłbym podać wynik item.getItemId() do przetworzenia za pomocą przełącznika.

Jaki jest normalny sposób wykonywania wielu czynności w tym samym menu opcji?

Odpowiedz

5

Jednym ze sposobów jest wykorzystanie dziedziczenia w swoich działaniach. Utwórz podstawową aktywność, która implementuje metody menu opcji, a następnie każda aktywność podrzędna zyskuje tę funkcję. To recommended approach na Androida stronie programu:

Wskazówka: Jeśli aplikacja zawiera wiele działań, a niektóre z nich oferują te same opcje menu, należy rozważyć utworzenie działalności, która implementuje nic oprócz onCreateOptionsMenu() i onOptionsItemSelected() metody. Następnie rozszerz tę klasę dla każdego działania, które powinno współdzielić to samo menu opcji. W ten sposób musisz zarządzać tylko jednym zestawem kodu do obsługi działań menu, a każda klasa potomków dziedziczy zachowania menu.

Niestety to nie zadziała, ponieważ nie dziedziczymy z samej działalności, ale różnią się podklasy, ale jest to "normalny" sposób, aby to zrobić.

+0

Jak się okazało, zapomniałem, że zawartość zakładki z 7-dniowego przewodnika Aktywność to w rzeczywistości ListActivity - Zmieniłem "wszystkie pokazy dzisiaj ..." Aktywność (nr 3 w moim pytaniu), aby również być ListActivity i zdefiniowano klasę podstawową, którą wszystkie trzy rozszerzają. Jedna z tych chwil, kiedy nie można zobaczyć lasu dla drzew. Dzięki. – Squonk

10

Tworzenie prostych osobną klasę z tych dwóch metod:

public class MyMenuHandler { 

    private Activity mActivity; 

    public MyMenuHandler(Activity activity) { 
     mActivity = activity; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuInflater inflater = mActivity.getMenuInflater(); 
     menu.clear(); 
     inflater.inflate(R.menu.gv_options_menu, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.view: 
      ... 
     } 
    } 
} 

W swoich działaniach zastąpić te metody wywołania zwrotnego i przekierować połączenie do instancji klasy MyMenuHandler:

public class MyActivity1 extends TabActivity { 

    private MyMenuHandler mMenuHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mMenuHandler = new MyMenuHandler(this); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // you may also add here some items which are specific 
     // for one activity, not for the others 
     ... 
     return mMenuHandler.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle selection of your specific items here, 
     // if none of them has been selected call mMenuHandler method 
     ... 
     return mMenuHandler.onOptionsItemSelected(item); 
    } 
} 

To pozwoli trzymasz w jednym miejscu kod, który odpowiada na wybór podstawowych pozycji menu, więc nie będzie trzeba się martwić o kopiowanie - wklejanie go do wszystkich czynności, które mają mieć to samo menu.

+0

Perfect a.ch. kumpel. –

2

Możesz zamknąć swoje menu akcji w postaci fragment. W ten sposób wystarczy dodać fragment w menu onCreate swojej aktywności.

Po utworzeniu fragmentu należy wywołać setHasOptionsMenu. Aby dodać fragment dodawania, należy użyć znacznika zamiast identyfikatora układu.

+0

Witam. czy masz jakiś dobry przykład (samouczek lub dowolny przykład) do tego? fragment jest dla mnie zupełnie nowy. – xDragonZ

+0

Zacznij od tego http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

Należy zauważyć, że ma to zastosowanie, jeśli używasz API poziomu 11 lub wyższego –