Должен ли «android: onOptionsItemSelected» возвращать true или false

#android

#Android

Вопрос:

В onOptionsItemSelected… Я видел некоторый код, который отличается в блоке switch.

Случай 1 (обычно видимый)

 public boolean onOptionsItemSelected (MenueItem item)
       switch (item.getItemId()){
             case R.id.item1:
             startActivity (new Intent (this, PrefsActivity.class));
             break;
       }
       return true
  

Случай 2 (не уверен, почему он настроен таким образом)

 public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
               case MENU_NEW_GAME:
               newGame();
               return true;
       }
       return false;
  

Мой вопрос

В чем различия между случаем 1 и случаем 2?

Ответ №1:

Согласно документации для onOptionsItemSelected()

ВОЗВРАТ

логическое значение возвращает false, чтобы продолжить обычную обработку меню, true, чтобы использовать его здесь.

Если возвращено значение true, событие click будет использовано вызовом onOptionsItemSelect() и не перейдет к другим функциям щелчка элемента. Если вы возвращаете false, это может проверить идентификатор события в других функциях выбора элемента.

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

Ответ №2:

Согласно документации
true —> Событие, использованное здесь, теперь его не следует пересылать для другого события
false —> Пересылать для использования другого события

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

В этом случае Android отслеживает метод OnOptionItemSelected() каждого фрагмента, чтобы избежать этого

а) Если какой-либо фрагмент использует событие в onOptionsItemSelected(), верните «true» (для остановки), иначе верните «false»
б) Если мы вернем false, то он будет отслеживать onOptionsItemSelected() другого связанного фрагмента
метод до тех пор, пока не закончится весь фрагмент или кто-нибудь не использует его.

введите описание изображения здесь

Здесь я попытался объяснить на диаграмме
Граница зеленого цвета — фрагмент-1, а граница красного цвета — фрагмент-2
у обоих фрагментов есть свое собственное Optionmenu, которое я выделил

Теперь если мы щелкнем по любому из OptionmenuItem, это проверит реализацию onOptionsItemSelected() в обоих фрагментах

Если какой-либо фрагмент использует событие onOptionsItemSelected, возвращает true, таким образом, он никогда не будет пытаться использовать другой фрагмент, и мы можем уменьшить накладные расходы операционной системы Android.

Комментарии:

1. какое значение по умолчанию возвращается из super.onOptionsItemSelected (item)?

Ответ №3:

Когда я использовал Android Studio для создания универсального приложения, код шаблона для onOptionsItemSelected() возвращает true, если элемент используется, в противном случае он передает вызов суперклассу.

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_mymenuaction) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
  

Комментарии:

1. я согласен с концепцией, но вам следует избегать нескольких операторов return. Это снижает читаемость. Лучше передавать логическое поле «результат» по кругу и завершать работу только в конце … один вход / один выход.

Ответ №4:

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

Ответ №5:

У меня просто возникла проблема с тем, что мой

 getActionBar().setDisplayHomeAsUpEnabled(true);
  

не работал. При нажатии кнопки «Назад» она будет выделена, но ничего не произошло.

Мне потребовалось некоторое время, чтобы понять, что это был возврат true.

На мой взгляд, лучшим решением с меньшим дублированием кода было бы следующее:

 public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
       case MENU_NEW_GAME:
           newGame();
           break;
       default:
           return false;
   }
   return true;
}