如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性相关的知识,希望对你有一定的参考价值。
我想在运行时切换ActionBar
上“向上”按钮(左箭头)的可见性。我试图使用项目id onPrepareOptionsMenu
访问R.id.home
中的按钮,因为这个id在onOptionsItemSelected
中工作,但是我一直在IndexOutOfBoundsException
中为活动的创建获得onPrepareOptionsMenu
。 “向上”按钮的正确项目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文档找到了解决方案,并认为最好将其发布回来。虽然其他答案都没有完全切换到Up按钮(至少不在我正在使用的平台上),但其中一些(和评论)非常有帮助,特别是在指向我使用ActionBar.setDisplayHomeAsUpEnabled()
时。但是,这里的关键是调用invalidateOptionsMenu()
强制重绘菜单。
在Android 3.0及更高版本中,当应用栏中显示菜单项时,选项菜单被视为始终打开。当事件发生并且您想要执行菜单更新时,必须调用invalidateOptionsMenu()以请求系统调用onPrepareOptionsMenu()。
所以我的最终解决方案是:
- 将
ActionBar
存储为实例变量(感谢@rupinderjeet); - 每当我想切换向上按钮时,就在
setDisplayHomeAsUpEnabled()
上调用ActionBar
; - 每次打电话给
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);
如果您使用默认操作栏,则获取操作栏和setDisplayHomeAsEnabled(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
}
以上是关于如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性的主要内容,如果未能解决你的问题,请参考以下文章
Android TabActivity 中的奇怪选项菜单行为