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

时间:2018-02-06 05:33:35

标签: java android android-actionbar android-navigation

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

4 个答案:

答案 0 :(得分:1)

我通过Android文档找到了解决方案,并认为最好将其重新发布到此处。尽管没有其他答案完全可以触发“向上”按钮(至少在我正在使用的平台上无效),但是其中一些(以及注释)非常有帮助,特别是在指示我使用ActionBar.setDisplayHomeAsUpEnabled()时。但是,此处的键是对 invalidateOptionsMenu() 的调用,该调用强制重新绘制菜单。

引用documentation

  

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

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

  • ActionBar存储为实例变量(感谢@rupinderjeet);
  • 每当我要切换“向上”按钮时,请致电setDisplayHomeAsUpEnabled()上的ActionBar
  • 每次致电invalidateOptionsMenu()后立即致电setDisplayHomeAsUpEnabled()

答案 1 :(得分:0)

  

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

全局声明变量,

private ActionBar supportActionBar;

onCreate()

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

以您想要的方法,

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

答案 2 :(得分: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); 

答案 3 :(得分:0)

如果您使用默认操作栏,则获取操作栏和setDisplayHomeAsEnabled(true)。

public Bitmap drawOnToCanvas(Bitmap bitmap, Matrix currentMatrix){


float centerX = (x  - (markerBitmap.getWidth()/2));
float centerY = (y + (markerBitmap.getHeight()/2));
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(bitmap, currentMatrix, null);
canvas.drawBitmap(markerBitmap, centerX , centerY, null);

return bitmap;

}

并设置后退箭头的任何操作,

 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");
        }