如何访问"Up"准备选项菜单中的按钮并在运行时切换其可见性



我想在运行时切换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
}

最新更新