Фрагмент onOptionsItemSelected не вызван

Мой фрагмент заменяет родительские параметры действия на определенный параметр, но когда я нажимаю на элемент, вызывается только событие onOptionItemSelected, хотя я переопределил метод внутри фрагмента. Я что-то пропустил?

Методы фрагмента:

@Override
public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    Log.d(TAG, "Fragment.onCreateOptionsMenu");

    if (mPasteMode) {
        menu.clear();
        inflater.inflate(R.menu.contexual_paste, menu);
        getActivity().getActionBar().setTitle("PasteMode");
    }
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "Fragment.onOptionsItemSelected");

    switch (item.getItemId()) {
        case R.id.context_action_paste:
            Toast.makeText(getActivity(),
                     "It worked ",
                    Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Методы действий:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected");
    switch (item.getItemId()) {
        case R.id.action_refresh:
            Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}

Выход Logcat:

MainActivity.onCreateOptionsMenu
Fragment.onCreateOptionsMenu
MainActivitiy.onOptionsItemSelected

Итак, как я могу получить onOptionsItemSelected фрагмента?

Ответы

Ответ 1

Вы не привязываетесь к суперклассу в методах активности. onCreateOptionsMenu() return super.onCreateOptionsMenu(menu) и onOptionsItemSelected() return super.onOptionsItemSelected(item) (за исключением обрабатываемого элемента, который должен возвращать true, чтобы указать, что вы обработали событие).

Ответ 2

Если ваш метод onOptionsItemSelected возвращает true, , вызов потребляется в активности, а фрагмент onOptionsItemSelected не вызывается. Таким образом, возвращает false в свой метод onOptionsItemSelected Activity/ или реализацию родительского класса через вызов super.onOptionsItemSelected(реализация по умолчанию возвращает false).

В соответствии с классом активности javadoc, метод Activity.onOptionsItemSelected должен:

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

Ответ 3

В моем случае я не добавлял никаких пунктов меню (т.е. я не вызывал onCreateOptionsMenu в активности или фрагменте). Тем не менее, мне нужно было использовать кнопку панели действий (вверх) в фрагменте. Для этого я должен был убедиться, что setHasOptionsMenu(true) был вызван в методе фрагмента onCreateView(), прежде чем это может сработать. Тогда мне не понадобилось переопределение onOptionsItemSelected в моей активности.