Панель инструментов AppCompat v7 onOptionsItemSelected not called
Я изменил исходный ActionBar на панель инструментов AppCompat и setSupportActionBar (панель инструментов).
Когда я использую getSupportActionBar() и setDisplayHomeAsUpEnabled (true) для стрелки назад, клик никогда не вызывает методOptionsItemSelected или любой другой метод прослушивания.
Нужно ли мне для этого использовать специальный прослушиватель? Befor все работало отлично.
EDIT:
Инициализировать ActionBar:
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mActionBar = getSupportActionBar();
mActionBar.setHomeButtonEnabled(true);
и после замены содержимого фрагментом я делаю это:
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
Ответы
Ответ 1
Мне пришлось реализовать OnClickListener для DrawerToggle:
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popStackIfNeeded();
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
mActionBar.setDisplayHomeAsUpEnabled(false);
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
});
это исправило мою проблему.
Ответ 2
Я знаю, что на этот вопрос был дан ответ, но я нашел истинную причину проблемы после 2 дней разочарования.
Взгляните на документацию ActionBarDrawerToggle:
https://developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle.html
Обратите внимание на два конструктора. Моя ошибка заключалась в том, что я использовал второй конструктор, который принимал панель инструментов в качестве параметра. Мне потребовалось столько времени, чтобы заметить последнюю строку в контурной документации:
" Используйте ActionBarDrawerToggle (Activity, DrawerLayout, int, int), если вы устанавливаете панель инструментов в качестве ActionBar своей активности.
После использования первого конструктора onOptionsItemSelected() вызывается без проблем.
Не забудьте вызвать ActionBarDrawerToggle.onConfigurationChanged() и onOptionsItemSelected() из вашей активности, как описано в последней части здесь: http://developer.android.com/training/implementing-navigation/nav-drawer.html
Ответ 3
У меня было несколько проблем с использованием метода setSupportActionBar(). Он также игнорирует определенные цветовые темы, поэтому вы не можете стилизовать значок стрелки назад или переполнения (не помните, какой из них). Я просто покончил с интеграцией ActionBar и использовал панель инструментов изначально. Итак, в качестве альтернативы вы можете сделать это следующим образом.
Просто включите панель инструментов, как обычно, в своем макете, предположите, что она использует идентификатор панели @+ id/toolbar.
Затем в коде:
_toolbar = (Toolbar) findViewById(R.id.toolbar);
_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleNavButtonPress();
}
});
_toolbar.setOnMenuItemClickListener(_menuItemClickListener);
_toolbar.inflateMenu(R.menu.message_list_menu);
Menu menu = _toolbar.getMenu();
В этом случае _menuItemClickListener может буквально быть вашим текущим методом onOptionsItemSelected() переименованным. Вам просто не нужно проверять, что для меню больше null.
Чтобы удалить элементы из меню, просто вызовите menu- > clear(). Поэтому в моем onPause
я очищаю меню и onResume, я раздуваю их, в своих фрагментах, и каждый фрагмент устанавливает обработчик кликов в onResume. Вам нужно всегда очищать, потому что Android не будет делать это для вас в этом подходе, и панель инструментов будет продолжать добавлять меню каждый раз, когда вы надуваете.
Последнее замечание, чтобы все это работало, вы должны полностью отключить панель действий и удалить ее из стиля.
Ответ 4
Одна вещь, о которой не упоминалось:
Если вы динамически создаете меню опций в onCreateOptionsMenu и возвращаете null, кнопка "вверх" на панели действий не будет работать.
Прекрасно работает, если вы вернете параметр меню, не добавляя в него ничего.
Протестировано на эмуляторе API 19
Ответ 5
Если вы все пробовали, и он просто не работает, вы можете реализовать свой собственный прослушиватель кликов следующим образом:
myNavList.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = myNavList.getItemAtPosition(position).toString();
Toast.makeText(this, "You selected " + item, Toast.LENGTH_SHORT).show();
}
});
Ответ 6
В моем случае setHasOptionsMenu(true);
не был включен в onCreateView
. Надеюсь, это поможет кому-то.