Повторное использование кода меню параметров - PullRequest
6 голосов
/ 14 ноября 2011

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

Пример. В моем приложении я отображаю руководство по телевизору одним из трех способов.

  1. Семидневный гид (TabActivity с 7 вкладками)
  2. Все каналы «Показываются сейчас» (ListActivity)
  3. Все показы за сегодня по времени начала (Activity - можно легко изменить на ListActivity)

Для меню параметров в 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:
        ...
    ...
    }
}

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

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

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

Ответы [ 3 ]

10 голосов
/ 14 ноября 2011

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

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);
    }
}

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

5 голосов
/ 14 ноября 2011

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

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

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

2 голосов
/ 14 ноября 2011

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

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

...