2011-11-14 5 views
6

Есть ли удобный способ отображения тех же опций меню опций в нескольких действиях?Повторное использование кода меню опций

Пример: В моем приложении я показываю ТВ-гид одним из трех способов.

  1. Семь дней руководство (TabActivity с 7 вкладками)
  2. Все каналы 'Теперь показывая' (ListActivity)
  3. Все шоу сегодня по времени начала (активность - может быть легко изменен на ListActivity)

Для меню Options в TabActivity, код довольно прост ...

@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: 
     ... 
    ... 
    } 
} 

... б ut в данный момент кажется, что мне нужно скопировать/вставить его в другие две действия, которые мне не нравятся. Если я изменил код меню «Параметры» для одного, мне нужно будет сделать это и для двух других.

Единственная альтернатива, которую я могу придумать, - это «класс помощника» (POJO), к которому я мог бы добавить метод, и передать context, чтобы разрешить использование метода getMenuInflator(), а другой метод - передать результат item.getItemId() для обработки с помощью футляра-переключателя.

Каков нормальный способ иметь несколько видов деятельности с тем же меню параметров?

ответ

5

Один из подходов заключается в использовании наследования с вашими действиями. Создайте базовую активность, которая реализует методы меню параметров, а затем каждая дочерняя активность получит эту функциональность. Это recommended approach на сайте Android разработчика:

Подсказка: Если приложение содержит несколько действий, и некоторые из них предоставляют те же опции меню, рассмотреть вопрос о создании деятельности, которая не реализует ничего, кроме onCreateOptionsMenu() и onOptionsItemSelected() методы. Затем расширьте этот класс для каждого действия, которое должно иметь одно и то же меню опций. Таким образом, вам нужно управлять только одним набором кода для обработки действий меню, и каждый класс потомков наследует поведение меню.

К сожалению, это не сработает для вас, поскольку вы не наследуете от самой деятельности, но отличаетесь от подклассов, но это обычный способ сделать это.

+0

Как оказалось, я забыл, что содержимое вкладки в 7-дневный справочник «Активность» - это ListActivitys - я изменил «все шоу сегодня ...» (№ 3 в моем вопросе), чтобы также быть ListActivity и определил базовый класс, который все три теперь расширяются. Один из тех моментов, когда он не видел леса для деревьев. Благодарю. – Squonk

10

Создать простой отдельный класс с этими двумя методами:

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

В своей деятельности переопределить эти методы обратного вызова и перенаправление вызова к экземпляру вашего класса 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); 
    } 
} 

Это позволит вы держите в одном месте код, который отвечает на выбор ваших основных пунктов меню, поэтому вам не придется беспокоиться о том, чтобы копировать его в все действия, которые должны иметь одно и то же меню.

+0

Идеальный a.ch. приятель. –

2

Вы можете инкапсулировать свое меню действий в fragment. Таким образом вам нужно только добавить фрагмент в меню onCreate вашей деятельности.

После создания фрагмента необходимо позвонить setHasOptionsMenu. Чтобы добавить фрагмент добавления, используйте тег вместо идентификатора макета.

+0

Привет. у вас есть хороший пример (учебник или какой-либо пример) для этого? фрагмент для меня совершенно новый. – xDragonZ

+0

начните с этого http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

Обратите внимание, что это применимо, если вы используете API-уровень 11 или выше –