Фрагмент 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
в моей активности.