如何访问 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() 强制重绘菜单。

引用documentation

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()