it-swarm.com.ru

Панель инструментов AppCompat v7 onOptionsItemSelected не вызывается

Я изменил исходный ActionBar на панель инструментов AppCompat и setSupportActionBar (панель инструментов) . Когда я использую getSupportActionBar () и setDisplayHomeAsUpEnabled (true) для стрелки назад, щелчок никогда не вызывает onOptionsItemSelected или любой другой метод слушателя.

Должен ли я реализовать какой-то специальный слушатель для этого? До этого все работало просто отлично.

Правка: Инициализировать панель действий:

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);
41
Informatic0re

Я знаю, что на этот вопрос ответили, но я нашел реальную причину проблемы после 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-box.html

114
Andrei Lupsa

Мне пришлось реализовать 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);
    }
});

это исправило мою проблему.

28
Informatic0re

У меня было несколько проблем с использованием метода setSupportActionBar (). Он также игнорирует определенные цветовые темы, поэтому вы не можете использовать стиль стрелки назад или значка переполнения (не помню какой). Я просто покончил с интеграцией ActionBar и изначально использовал панель инструментов. Так что, в качестве альтернативы, вы можете сделать это следующим образом.

Просто включите панель инструментов, как обычно, в свой макет, предположим, что она использует идентификатор @ + id/панель инструментов.

Затем в коде:

_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 (), переименованным. Вам просто не нужно проверять, чтобы меню больше не было.

Чтобы удалить элементы из меню, просто вызовите menu-> clear (). Итак, в моем onPause я очищаю меню и onResume, раздуваю их в своих фрагментах, и каждый фрагмент устанавливает обработчик щелчков в onResume. Вы должны всегда убирать, потому что при таком подходе Android не сделает этого за вас, а панель инструментов будет добавлять меню каждый раз, когда вы надуваетесь.

И последнее замечание: чтобы все это работало, вы должны полностью отключить панель действий и удалить ее из стиля.

4
reactive-core

Если вы все перепробовали, и это просто не работает, вы можете реализовать свой собственный приемник щелчков следующим образом:

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();
    }
});
0
Prof

Одна вещь, которая не была упомянута:
Если вы динамически строите меню параметров в onCreateOptionsMenu и возвращаете null там, кнопка вверх на панели действий не будет работать.
Отлично работает, если вы возвращаете параметр Menu, не добавляя в него ничего. 

Проверено на эмуляторе API 19

0
Max Izrin

В моем случае функция setHasOptionsMenu(true); не была включена для onCreateView. Надеюсь, это кому-нибудь поможет.

0
Coder Absolute