Android: Как создать общее меню в каждом (List) Activity, не переписывая переопределенные методы? - PullRequest
6 голосов
/ 05 января 2010

Я знаю, что Android предоставляет некоторые полезные методы, которые должны быть переопределены для определения меню:

    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
                // ...
  return true;
 }

 public boolean onOptionsItemSelected(MenuItem item) {
  Intent i;
     switch (item.getItemId()) {
     case AIS: i = new Intent(this, ActivityInventorySheet.class);
      startActivity(i);
               return true;
     // ...
     }
     return false;
 }

Я бы хотел, чтобы это меню использовалось всеми Активностями и ListActivity моего приложения для Android. Это для того, чтобы иметь стандартное меню в каждом (Списке) Деятельности, которое позволяет пользователю переходить к каждой части приложения в пределах щелчка.

Прямо сейчас, самый простой способ добиться этого - скопировать и вставить оба метода в каждую (Список) активность приложения. Мне не нравится эта избыточность написанного кода:)

Является ли подклассификация разумным выбором? Я уже видел, что подклассирование одного из моих ListActivity работает не очень хорошо (потоки, которые извлекают объекты из базы данных, создают проблемы). Есть ли другие способы поделиться меню, хотя деятельность?

Спасибо

Ответы [ 3 ]

13 голосов
/ 05 января 2010

Я использую вспомогательный класс со статическими методами для инициализации и обработки общих параметров меню, затем каждое действие определяет свой собственный onCreateOptionsMenu и т. Д., Которое делегирует общие задачи вспомогательному классу и может добавлять дополнительные элементы меню, специфичные для этого действия.

Что-то вроде

class SharedMenu {
    public static void onCreateOptionsMenu(Menu menu) {
        menu.add(...);
        menu.add(...);
    }
}

public class MyActivity extends Activity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(...);  // specific to this activity
        SharedMenu.onCreateOptionsMenu(menu);
        return true;
    }

}

с дополнительными методами для onMenuItemSelected и т. Д.

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

10 голосов
/ 05 января 2010

Не вижу причин, по которым это не сработало бы идеально:

public abstract class MyListActivity extends ListActivity
{
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
      // ...
      return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      Intent i;
      switch (item.getItemId()) {
          case AIS: i = new Intent(this, ActivityInventorySheet.class);
          startActivity(i);
          return true;
          // ...
      }
      return false;
   }    
}

Тогда просто сделайте так, чтобы ваши Действия расширяли MyListActivity вместо ListActivity.

Я уже видел этот подкласс один из моих ListActivity не работает очень хорошо (темы, которые получают объекты из базы данных дают проблемы).

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

1 голос
/ 16 августа 2011

Я только что добавил функцию к GreenDroid для управления этим. Может быть весьма полезным, проверьте это. Я постараюсь опубликовать пример позже.

...