Андроид:Как иметь общее меню в каждом (списке) действии без переписывания переопределенных методов?

StackOverflow https://stackoverflow.com/questions/2006457

Вопрос

Я знаю, что 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;
 }

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

На данный момент самый простой способ добиться этого — скопировать и вставить оба метода в каждое действие (список) приложения.Мне не нравится эта избыточность написанного кода :)

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

Спасибо

Это было полезно?

Решение

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

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.

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

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

Другие советы

Я использую вспомогательный класс со статическими методами для инициализации и обработки общих опций меню, затем каждое действие определяет свои собственные. 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 и т. д.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top