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

Панель инструментов 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);
4b9b3361

Ответ 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. Надеюсь, это поможет кому-то.