Подтвердить что ты не робот

Если "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?

4b9b3361

Ответ 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;
}