未调用AppCompat v7工具栏onOptionsItemSelected

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

我需要为它实现一些特殊的监听器吗? 贝福一切工作得很好。

编辑:初始化的ActionBar:

mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); mActionBar = getSupportActionBar(); mActionBar.setHomeButtonEnabled(true); 

并用片段replace内容后,我这样做:

 mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); mDrawerToggle.setDrawerIndicatorEnabled(false); mActionBar.setDisplayHomeAsUpEnabled(true); 

我知道这个问题已经得到解答,但经过两天的沮丧,我发现了问题的真正原因。

看看ActionBarDrawerToggle文档: https : //developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle.html

注意那里的两个构造函数。 我的错误是,我正在使用第二个构造函数,以工具栏作为参数。 我花了这么长时间才注意到consturctor文档中的最后一行:“ 如果将工具栏设置为活动的ActionBar,请使用ActionBarDrawerToggle(Activity,DrawerLayout,int,int)

在使用第一个构造函数onOptionsItemSelected()后,调用没有问题。

不要忘记从您的活动中调用ActionBarDrawerToggle.onConfigurationChanged()onOptionsItemSelected() ,如最后一部分所述: http : //developer.android.com/training/implementing-navigation/nav-drawer.html

我不得不为DrawerToggle实现一个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()方法的问题。 它也忽略了某些颜色主题,所以你不能devise后退箭头或溢出图标(不记得哪个)。 我只是消除了与ActionBar的集成,并本身使用工具栏。 所以,作为一个select,你可以这样做,如下所示。

只要像你通常那样在你的布局中包含工具栏,假设它使用了@ + id / toolbar的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()方法重命名。 你只是不必检查菜单是空的了。

要从菜单中删除项目,只需调用菜单 – >清除()。 所以在我的onPause ,我清除菜单和onResume,我膨胀他们,在我的片段,每个片段设置点击处理程序在onResume。 你需要经常清理,因为在这种方法下,Android不会为你做这件事,而且每次你​​膨胀的时候,工具栏都会一直添加菜单。

最后一个注意事项,为了使所有的工作,你必须完全禁用操作栏,并从风格中删除它。

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

testing仿真器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(); } }); 

在我的情况下, setHasOptionsMenu(true);onCreateView上未启用。 希望这有助于某人。