我想在运行时切换ActionBar
上"向上"按钮(左箭头)的可见性。我尝试使用项目 IDR.id.home
访问onPrepareOptionsMenu
中的按钮,因为此 id 在onOptionsItemSelected
中有效,但是我在活动创建onPrepareOptionsMenu
中不断获得该特定行的IndexOutOfBoundsException
。"向上"按钮的正确项目 ID 是什么?或者有更好的方法在运行时切换"向上"按钮?
这是我的代码:
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem up = menu.getItem(R.id.home);
if (phase != Phase.IDLE) { // this is the runtime situation in which I want to disable the Up navigation
up.setVisible(false);
} else {
up.setVisible(true);
}
return true;
}
我也试过android.R.id.home
,得到了同样的错误。
我通过Android文档找到了解决方案,并认为最好将其发布回此处。尽管其他答案都没有完全用于切换向上按钮(至少在我正在使用的平台上没有),但其中一些(和评论)非常有帮助,尤其是在指出我使用ActionBar.setDisplayHomeAsUpEnabled()
时。但是,这里的关键是对invalidateOptionsMenu()
的调用,该调用强制重新绘制菜单。
引用文档:
在 Android 3.0 及更高版本上,选项菜单始终被视为 当菜单项显示在应用栏中时打开。当事件发生时 发生,并且您想要执行菜单更新,您必须调用 invalidateOptionsMenu() 请求系统调用 onPrepareOptionsMenu()。
所以我的最终解决方案是:
- 将
ActionBar
存储为实例变量(感谢@rupinderjeet); - 每当我想切换向上按钮时,都会在
ActionBar
上拨打setDisplayHomeAsUpEnabled()
; -
每次呼叫
invalidateOptionsMenu()
后立即呼叫setDisplayHomeAsUpEnabled()
。
没有更好的方法在运行时切换"向上"按钮?
全局声明变量,
private ActionBar supportActionBar;
在onCreate()
,
setSupportActionBar(toolbar); // v7.Toolbar from support package
supportActionBar = getSupportActionBar();
在您想要的方法中,
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true); // or false
}
如果您使用的是默认工具栏
//show
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//hide
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
如果您使用的是自定义工具栏.
// get a refrence to your toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
如果您使用的是默认操作栏,则获取操作栏并设置显示HomeAsEnabled(true)。
ActionBar actionBar = getSupportActionBar();
if (actionBar != null)
{
//setting action bar with custom color defined in colors
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setBackgroundDrawable(new
ColorDrawable(ContextCompat.getColor(context, R.color.action_bar)));
actionBar.setTitle("ActionBar Name");
}
并设置后退箭头按的任何操作,
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
// home (back arrow) icon id
// do Task here
}