我从原来的ActionBar更改为AppCompat工具栏和setSupportActionBar(工具栏)。 当我使用getSupportActionBar()和setDisplayHomeAsUpEnabled(true)作为后退箭头时,单击从不调用onOptionsItemSelected或任何其他侦听器方法。
我必须为它实现一些特殊的监听器吗?一切都很顺利。
编辑: 初始化ActionBar:
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mActionBar = getSupportActionBar();
mActionBar.setHomeButtonEnabled(true);
在用Fragment替换内容后,我这样做:
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerToggle.setDrawerIndicatorEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
答案 0 :(得分:115)
我知道这个问题已得到解答,但经过2天的挫折后,我找到了问题的真正原因。
查看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 < / p>
答案 1 :(得分:28)
我必须为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);
}
});
这解决了我的问题。
答案 2 :(得分:4)
我使用setSupportActionBar()方法遇到了几个问题。它也忽略了某些颜色主题,因此您无法设置后箭头或溢出图标的样式(不记得哪个)。我刚刚取消了ActionBar集成并本地使用工具栏。所以,作为替代方案,你可以这样做。
只需在您的布局中包含工具栏,就像使用@ + 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()方法重命名。您不必再检查菜单是否为空。
要从菜单中删除项目,只需调用menu-&gt; clear()。所以在我的onPause
中,我清除了菜单和onResume,我在我的片段中对它们进行了膨胀,每个片段都在onResume中设置了click处理程序。你需要经常清理,因为Android在这种方法中不会为你做这件事,而且每次你膨胀时工具栏都会不断添加菜单。
最后一点,为了使一切正常,您必须完全禁用操作栏并将其从样式中删除。
答案 3 :(得分:0)
有一件事没有提到:
如果您在 onCreateOptionsMenu 中动态构建选项菜单并在那里返回 null ,则操作栏中的向上按钮将不起作用。
如果您返回Menu参数而不向其中添加任何内容,则可以正常工作。
在模拟器API 19上测试
答案 4 :(得分:0)
如果您已尝试过所有内容并且它无法正常工作,您可以像这样实现自己的点击监听器:
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();
}
});
答案 5 :(得分:0)
就我而言,setHasOptionsMenu(true);
未启用onCreateView
。希望这有助于某人。