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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性相关的知识,希望对你有一定的参考价值。

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

答案

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

引用documentation

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

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

  • ActionBar存储为实例变量(感谢@rupinderjeet);
  • 每当我想切换向上按钮时,就在setDisplayHomeAsUpEnabled()上调用ActionBar;
  • 每次打电话给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); 
另一答案

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

         }

以上是关于如何访问onPrepareOptionsMenu中的“向上”按钮并在运行时切换其可见性的主要内容,如果未能解决你的问题,请参考以下文章

Android场景-001- Menu动态改变

Menu菜单

Android TabActivity 中的奇怪选项菜单行为

如何使用 ALAssetsLibrary 访问照片而不在 iOS5 中请求位置访问?

在SQL数据访问中如何对不同级别设置访问权限

C#如何在另外一个类中访问Form中控件属性?