Android AppCompat v7工具栏onOptionsItemSelected未调用

Android AppCompat v7工具栏onOptionsItemSelected未调用,android,android-actionbar,toolbar,android-5.0-lollipop,android-appcompat,Android,Android Actionbar,Toolbar,Android 5.0 Lollipop,Android Appcompat,我从原来的ActionBar改为AppCompat工具栏和setSupportActionBar(工具栏)。 当我对后退箭头使用getSupportActionBar()和setDisplayHomeAsUpEnabled(true)时,单击从不调用Options ItemSelected或任何其他侦听器方法 我必须为它实现一些特殊的侦听器吗?在一切顺利之前 编辑: 初始化操作栏: mToolbar = (Toolbar) findViewById(R.id.toolbar); setSuppo

我从原来的ActionBar改为AppCompat工具栏和setSupportActionBar(工具栏)。 当我对后退箭头使用getSupportActionBar()和setDisplayHomeAsUpEnabled(true)时,单击从不调用Options ItemSelected或任何其他侦听器方法

我必须为它实现一些特殊的侦听器吗?在一切顺利之前

编辑: 初始化操作栏:

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

我必须为抽屉切换实现OnClickListener:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        popStackIfNeeded();
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        mActionBar.setDisplayHomeAsUpEnabled(false);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    }
});

这解决了我的问题。

我在使用setSupportActionBar()方法时遇到了几个问题。它也会忽略某些颜色主题,因此无法设置后向箭头或溢出图标的样式(不记得是哪个)。我刚刚取消了ActionBar集成,并以本机方式使用工具栏。因此,作为一种替代方法,您可以按如下方式进行操作

只需像平常一样在布局中包含工具栏,假设它使用的id为@+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();
在这种情况下,\ u menuItemClickListener几乎可以是您当前的onOptions ItemSelected()方法。您不必再检查菜单是否为空

要从菜单中删除项目,只需调用menu->clear()。因此,在我的
onPause
中,我清除菜单和onResume,在片段中对它们进行充气,每个片段在onResume中设置单击处理程序。你需要经常清理,因为Android在这种方法中不会为你这样做,而且每次你充气时,工具栏都会不断添加菜单


最后一点要注意的是,要使其正常工作,您必须完全禁用操作栏并将其从样式中删除。

我知道这个问题已经得到了回答,但经过两天的挫折之后,我找到了问题的真正原因

请看ActionBarDrawerToggle文档:

注意那里的两个构造函数。我的错误是,我使用了第二个构造函数,它将工具栏作为参数。我花了很长时间才注意到Constructor文档中的最后一行: 如果要将工具栏设置为活动的操作栏,请使用ActionBarDrawerToggle(活动,抽屉布局,int,int)

使用第一个构造函数后,调用OnOptions ItemSelected()时没有出现任何问题


不要忘记从您的活动中调用ActionBarDrawerToggle.onConfiguration Changed()OnOptions ItemSelected(),如本文最后一部分所述:

有一件事没有提到:
如果在创建选项菜单中动态构建选项菜单,并在其中返回null,则操作栏中的向上按钮将不起作用。
如果返回菜单参数而不向其中添加任何内容,则可以正常工作


在emulator API 19上测试,如果您尝试了所有方法,但都不起作用,您可以实现自己的单击侦听器,如下所示:

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();
    }
});
myNavList.setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
String item=myNavList.getItemAtPosition(position).toString();
Toast.makeText(此“您选择的”+项,Toast.LENGTH_SHORT).show();
}
});

在我的例子中,
设置选项菜单(true)。希望这对某人有所帮助。

您是否尝试过设置选项菜单(true)?我正在参加活动。此外,当我按下后退箭头时,不会调用onSupportNavigateUp()。在我的情况下,从未调用navigationOnClickListener。但现在我明白了,我必须实现抽屉切换设置工具栏导航ClickListener。顺便说一句,我正在使用NavigationDrawer,我想这就是问题所在。@IgorGanapolsky,不,它在android.support.v7.widget.Toolbar.Wow中提供。那些构造函数有点违反直觉。这绝对是我的问题。谢谢,你刚刚帮我省去了几个小时的撞墙时间!找到这个小东西真是太好了!我有完全相同的场景。这应该是公认的答案,因为公认的答案现在提供了一种解决方法,而不是解决实际问题的方法。简言之,如果我理解正确:在ActionBarDrawer构造函数的参数中添加工具栏时,navuparrow将在抽屉打开时显示,hamburger将在抽屉关闭时显示。不会调用home按钮回调。在构造ActionBarDrawer时,不使用工具栏作为参数,我们可以使用home按钮回调。例如,这意味着我们可以管理backbackback片段。如何在Gmail应用程序中同步home按钮来设置动画?另外,当使用不带工具栏的选项作为参数时,汉堡包图标也不会显示在我面前。任何解释都将不胜感激。谢谢你,也救了我一天!这里有几十个问题和回答,但没有一个适合我。我认为我们应该为这个问题添加一些键盘,比如“导航抽屉未显示汉堡图标”或“导航抽屉未打开菜单图标单击工具栏”。这不是正确的方法,除非有充分的理由,否则不应该处理切换单击。请看安德烈的解决方案。