如何在工具栏中添加“返回”按钮?

5

这是一个简短的问题:

我试图强制操作栏(由工具栏使用)使用LTR对齐。 我已成功使布局本身使用LTR,但不是“向上”按钮(就像我之前在这里做过一样,Toolbar被引入之前)。

似乎此视图没有ID,我认为使用getChildAt()太冒险了。

有人能帮忙吗?


答案

这是我发现的一种解决方法,基于这个答案

我使其保证只找到“向上”按钮,无论它做什么,都会恢复到以前的状态。

以下是代码:

  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  @Override
  public boolean onCreateOptionsMenu(final Menu menu)
    {
    // <= do the normal stuff of action bar menu preparetions
    if(VERSION.SDK_INT>=VERSION_CODES.JELLY_BEAN_MR1&&getResources().getConfiguration().getLayoutDirection()==View.LAYOUT_DIRECTION_RTL)
      {
      final ArrayList<View> outViews=new ArrayList<>();
      final CharSequence previousDesc=_toolbar.getNavigationContentDescription();
      for(int id=0;;++id)
        {
        final String uniqueContentDescription=Integer.toString(id);
        _toolbar.findViewsWithText(outViews,uniqueContentDescription,View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        if(!outViews.isEmpty())
          continue;
        _toolbar.setNavigationContentDescription(uniqueContentDescription);
        _toolbar.findViewsWithText(outViews,uniqueContentDescription,View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
        if (outViews.isEmpty())
           if (BuildConfig.DEBUG)
                    throw new RuntimeException(
                            "You should call this function only when the toolbar already has views");
                else
                    break;
        outViews.get(0).setRotation(180f);
        break;
        }
      _toolbar.setNavigationContentDescription(previousDesc);
      }
    //
    return super.onCreateOptionsMenu(menu);
    }

不,只要你覆盖了所有边缘情况,getChildAt() 就不会有风险。 - Nikola Despotoski
但即使如此,我仍然需要确定它是正确的视图。无论如何,还有其他方法可以实现这一点吗? - android developer
你可以使用反射机制并迭代声明的字段,找到确切名称的字段(比如说“mNavButtonView”)。这将确保你指向正确的视图。但我不建议使用反射机制。你最好迭代子元素并检查它们的类实例。 - Nikola Despotoski
1个回答

10

看起来这个视图没有ID

没错,导航视图是通过程序创建的,从未设置过ID。但是你仍然可以使用View.findViewsWithText找到它。

View.findViewsWithText带有两个标志:

导航视图的默认内容描述为“向上导航”或资源ID为abc_action_bar_up_description(AppCompat)和action_bar_up_description(框架),但你可以使用Toolbar.setNavigationContentDescription轻松应用自己的描述。

这里是一个示例实现:

final Toolbar toolbar = ...;
toolbar.setNavigationContentDescription("up");
setActionBar(toolbar);

final ArrayList<View> outViews = Lists.newArrayList();
toolbar.findViewsWithText(outViews, "up", View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);

outViews.get(0).setRotation(180f);

结果

example


不错的解决方案。这个函数是做什么的?文档说:“如果存在导航按钮,则为其设置内容描述。屏幕阅读器或其他辅助功能系统将通过内容描述来解释导航按钮的操作。” 这是当您长按操作项时显示的toast吗?如果是,那“向上”按钮会发生什么?此外,它总是列表中第一个视图成为“向上”按钮吗?即使有其他具有此值的视图?或者,也许因为您在菜单膨胀之前很久就调用它了,所以这无论如何都没有关系? - android developer
好的,我找到了所有的问题,并更新了问题以包含完整的答案。我这样做是因为你的答案是正确的,只是缺少一些特殊处理。谢谢你的帮助。 - android developer
@androiddeveloper 当我说默认情况下它没有内容描述时,我是错误的。当然它有,并且我已经相应地编辑了我的答案。这是在打开辅助功能的人长按它时显示或朗读的内容。View.findViewsWithText遍历调用该方法的任何View的视图层次结构。它将找到每个使用您提供的文本或内容描述的View,具体取决于标志。但导航视图的内容描述应该已经是唯一的,不需要那个循环。 - adneal
由于我不想更改任何视图的此值,并且我不想找到错误的结果(以防其他项目具有此值),因此我不得不添加这些操作。这应该适用于任何可能的情况。 - android developer
你知道如何使用支持actionBar来完成它吗?那里的id也不可用... - android developer
顺便提一下,为了获取支持操作模式视图,您可以使用“R.id.action_mode_bar”。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接