如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性

问题描述 投票:0回答:4

我想在运行时切换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,得到了同样的错误。

java android android-actionbar android-navigation
4个回答
1
投票

我通过Android文档找到了解决方案,并认为最好将其发布回来。虽然其他答案都没有完全切换到Up按钮(至少不在我正在使用的平台上),但其中一些(和评论)非常有帮助,特别是在指向我使用ActionBar.setDisplayHomeAsUpEnabled()时。但是,这里的关键是调用invalidateOptionsMenu()强制重绘菜单。

引用documentation

在Android 3.0及更高版本中,当应用栏中显示菜单项时,选项菜单被视为始终打开。当事件发生并且您想要执行菜单更新时,必须调用invalidateOptionsMenu()以请求系统调用onPrepareOptionsMenu()。

所以我的最终解决方案是:

  • ActionBar存储为实例变量(感谢@rupinderjeet);
  • 每当我想切换向上按钮时,就在setDisplayHomeAsUpEnabled()上调用ActionBar;
  • 每次打电话给invalidateOptionsMenu()后立即致电setDisplayHomeAsUpEnabled()

0
投票

有没有更好的方法在运行时切换“向上”按钮?

全局声明变量,

private ActionBar supportActionBar;

onCreate()

setSupportActionBar(toolbar);  // v7.Toolbar from support package
supportActionBar = getSupportActionBar();

按照你想要的方法,

if (supportActionBar != null) {
    supportActionBar.setDisplayHomeAsUpEnabled(true); // or false
}

0
投票

如果您使用默认工具栏

    //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); 

0
投票

如果您使用默认操作栏,则获取操作栏和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

         }
© www.soinside.com 2019 - 2024. All rights reserved.