Если «android: onOptionsItemSelected» возвращает true или false

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

Случай 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?

Solutions Collecting From Web of "Если «android: onOptionsItemSelected» возвращает true или false"

kleaver,

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

Возвращает

Boolean Возвращает false, чтобы нормальная обработка меню продолжалась, правда, чтобы потреблять ее здесь.

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

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

Согласно документации
True -> Событие, потребляемое сейчас. Оно не должно пересылаться для другого события
False -> Вперед для других, чтобы потреблять

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

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

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

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

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

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

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

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

Когда я использовал 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); } 

У меня просто была проблема, что моя

 getActionBar().setDisplayHomeAsUpEnabled(true); 

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

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

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

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