Если "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?
Ответы
Ответ 1
kleaver,
В документации для onOptionsItemSelected()
Возвращает
boolean Возвращает false, чтобы разрешить нормальное для обработки, чтобы потребляйте его здесь.
Если возвращается true, событие click будет потребляться вызовом onOptionsItemSelect() и не попадет на другие функции щелчка элемента. Если ваше возвращение false, оно может проверить идентификатор события в других функциях выбора элементов.
Ваш метод все равно будет работать, но может привести к ненужным вызовам других функций. Идентификатор в конечном итоге провалится через эти функции, так как нет переключателя, чтобы его поймать, но возврат false правилен.
Ответ 2
Согласно документация
true → Событие, потребляемое здесь, теперь оно не должно пересылаться для другого события
false → Вперед для другого события, которое нужно использовать
Этот тип логического возврата действительно выгоден, когда мы работаем с несколькими фрагментами, и каждый фрагмент имеет свое собственное меню опций и переопределяет OnOptionItemSelected (главным образом в дизайне планшета).
В этом случае андроид трассирует каждый фрагмент OnOptionItemSelected(), чтобы избежать этого
a) Если какой-либо фрагмент потребляет событие в onOptionsItemSelected() возвращает "true" (для остановки) else возвращает "false"
b) Если мы вернем false, то он проследит другой метод связанного фрагмента onOptionsItemSelected() до тех пор, пока не закончит весь фрагмент, или кто-то его не примет.
![введите описание изображения здесь]()
Здесь я попытался объяснить из диаграммы
Зеленая граница цвета - фрагмент-1, а красная граница цвета - фрагмент-2
Оба фрагмента имеют свой собственный Optionmenu, который я выделил
Теперь Если щелкнуть любой из вариантов, он будет проверять реализацию onOptionsItemSelected() в обоих фрагментах
Если какой-либо фрагмент потребляет событие onOptionsItemSelected возвращает true, к этому он никогда не будет пытаться использовать другой фрагмент, и мы можем уменьшить накладные расходы операционной системы Android.
Ответ 3
Проблема с вашим методом заключается в том, что вы возвращаете true, даже если ваш оператор switch не находит элемент. Если вы немедленно вернете истину, как и другой метод для каждого случая коммутатора, вы можете предположить, что если вы находитесь в конце метода, то не было обнаружено никаких случаев переключения, поэтому верните false, чтобы показать, что он не обрабатывается.
Ответ 4
Когда я использовал 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);
}
Ответ 5
У меня просто была проблема, что мой
getActionBar().setDisplayHomeAsUpEnabled(true);
не работал. При касании кнопки "Назад" оно будет подсвечено, но ничего не произошло.
Мне потребовалось некоторое время, чтобы понять, что это было возвращение истины.
По моему мнению, лучшим решением с меньшим дублированием кода будет следующее:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_NEW_GAME:
newGame();
break;
default:
return false;
}
return true;
}