Java “如何访问”;“向上”;按钮,并在运行时切换其可见性

Java “如何访问”;“向上”;按钮,并在运行时切换其可见性,java,android,android-actionbar,android-navigation,Java,Android,Android Actionbar,Android Navigation,我想在运行时切换ActionBar上的“向上”按钮(左箭头)的可见性。我尝试使用项目idR.id.home访问onprepareoptions菜单中的按钮,因为此id在onoptionsintemselected中工作,但是我在创建活动时不断获得onprepareoptions菜单中特定行的索引自动边界异常。“向上”按钮的正确项目id是什么?还是有更好的方法在运行时切换“向上”按钮 这是我的密码: public boolean onPrepareOptionsMenu(Menu menu) {

我想在运行时切换
ActionBar
上的“向上”按钮(左箭头)的可见性。我尝试使用项目id
R.id.home
访问
onprepareoptions菜单中的按钮,因为此id在
onoptionsintemselected
中工作,但是我在创建活动时不断获得
onprepareoptions菜单中特定行的
索引自动边界异常。“向上”按钮的正确项目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;
}

我也试过安卓.R.id.home
,得到了同样的错误

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

全局声明变量

private ActionBar supportActionBar;
onCreate()

用你想要的方法

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)

以及设置后退箭头按钮的任何操作

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == android.R.id.home) {

            // home (back arrow) icon id
            // do Task here

         }

我通过Android文档找到了解决方案,并认为最好将其发布回这里。尽管其他答案中没有一个完全适用于切换向上按钮(至少在我使用的平台上没有),但其中一些答案(以及注释)非常有用,特别是在指向我使用
ActionBar.setDisplayHomeAsUpEnabled()
时。但是,这里的关键是调用
无效操作菜单()
,强制重新绘制菜单

引述:

在安卓3.0及更高版本上,选项菜单被认为总是 当应用程序栏中显示菜单项时打开。当一件事发生时 如果要执行菜单更新,则必须调用 InvalidateOptions功能表()请求系统调用 onPrepareOptions菜单()

因此,我的最终解决方案是:

  • ActionBar
    存储为实例变量(感谢@rupinderjeet)
  • 每当我想切换向上按钮时,在
    操作栏上调用
    setDisplayHomeAsUpEnabled()
  • 每次调用
    setDisplayHomeAsUpEnabled()
    后立即调用
    InvalidateOptions菜单()

android.R.id.home
?@向导我尝试过,同样的错误:(
getItem()
采用索引值,这就是为什么会出现特定异常。
findItem()
接受ID,但是,即使在
活动中有ID为android.R.ID.home的
视图,它也不是选项菜单中的一项。您也可以通过常规的
findViewById()
调用来获得它。不过,根据您的情况,可能没有带有该ID的主页按钮。
 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

         }