如何访问 onPrepareOptionsMenu 中的 "Up" 按钮并在运行时切换其可见性
How to access "Up" button in onPrepareOptionsMenu and toggle its visibility at runtime
我想在运行时切换 ActionBar
上的 "Up" 按钮(左箭头)的可见性。我尝试使用项目 ID R.id.home
访问 onPrepareOptionsMenu
中的按钮,因为此 ID 在 onOptionsItemSelected
中有效,但是我一直在 onPrepareOptionsMenu
中为该特定行获取 IndexOutOfBoundsException
] 关于 activity 的创作。 "Up" 按钮的正确项目 ID 是什么?或者是否有更好的方法在运行时切换"Up"按钮?
这是我的代码:
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
,也是同样的错误。
is there a better way to toggle the "Up" button at runtime?
全局声明变量,
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);
如果您使用默认操作栏,获取操作栏并设置 DisplayHomeAsEnabled(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
}
我通过 Android 文档找到了解决方案,并认为最好 post 回到这里。尽管 none 的其他答案在切换“向上”按钮方面完全有效(至少在我使用的平台上没有),但其中一些(和评论)非常有帮助,特别是在指出我使用 ActionBar.setDisplayHomeAsUpEnabled()
。然而,这里的关键是调用 invalidateOptionsMenu()
强制重绘菜单。
On Android 3.0 and higher, the options menu is considered to always be
open when menu items are presented in the app bar. When an event
occurs and you want to perform a menu update, you must call
invalidateOptionsMenu() to request that the system call
onPrepareOptionsMenu().
所以我最终的解决方案是:
- 将
ActionBar
存储为实例变量(感谢@rupinderjeet);
- 每当我想切换向上按钮时,在
ActionBar
上调用 setDisplayHomeAsUpEnabled()
;
- 每次调用
setDisplayHomeAsUpEnabled()
后立即调用invalidateOptionsMenu()
。
我想在运行时切换 ActionBar
上的 "Up" 按钮(左箭头)的可见性。我尝试使用项目 ID R.id.home
访问 onPrepareOptionsMenu
中的按钮,因为此 ID 在 onOptionsItemSelected
中有效,但是我一直在 onPrepareOptionsMenu
中为该特定行获取 IndexOutOfBoundsException
] 关于 activity 的创作。 "Up" 按钮的正确项目 ID 是什么?或者是否有更好的方法在运行时切换"Up"按钮?
这是我的代码:
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
,也是同样的错误。
is there a better way to toggle the "Up" button at runtime?
全局声明变量,
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);
如果您使用默认操作栏,获取操作栏并设置 DisplayHomeAsEnabled(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
}
我通过 Android 文档找到了解决方案,并认为最好 post 回到这里。尽管 none 的其他答案在切换“向上”按钮方面完全有效(至少在我使用的平台上没有),但其中一些(和评论)非常有帮助,特别是在指出我使用 ActionBar.setDisplayHomeAsUpEnabled()
。然而,这里的关键是调用 invalidateOptionsMenu()
强制重绘菜单。
On Android 3.0 and higher, the options menu is considered to always be open when menu items are presented in the app bar. When an event occurs and you want to perform a menu update, you must call invalidateOptionsMenu() to request that the system call onPrepareOptionsMenu().
所以我最终的解决方案是:
- 将
ActionBar
存储为实例变量(感谢@rupinderjeet); - 每当我想切换向上按钮时,在
ActionBar
上调用setDisplayHomeAsUpEnabled()
; - 每次调用
setDisplayHomeAsUpEnabled()
后立即调用invalidateOptionsMenu()
。