【问题标题】:How to get the "up" button used on the Toolbar?如何获取工具栏上使用的“向上”按钮?
【发布时间】:2014-11-27 16:06:52
【问题描述】:

这是一个简短的问题:

我正在尝试强制操作栏(由工具栏使用)使用 LTR 对齐。我已经成功地使布局本身使用 LTR,但不是“向上”按钮(就像我在 Toolbar 引入之前所做的 here 一样)。

这个视图好像没有ID,我觉得用getChildAt()太冒险了。

谁能帮忙?


答案

这是我发现的一种解决方法,基于 this answer

我这样做是为了保证它只能找到“向上”按钮,无论它做什么,它都会恢复到之前的状态。

代码如下:

  @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() 没有风险,只要你涵盖了所有的 egde 案例。
  • 但即便如此,我也需要确定这是正确的视图。无论如何,还有其他方法可以实现这一目标吗?
  • 您可以使用反射并迭代声明的字段并找到具有您要查找的确切名称的字段(比如说“mNavButtonView”)。这将保证您指向正确的视图。但我不建议使用反射。您宁愿遍历孩子并检查他们的类实例。

标签: android android-actionbar right-to-left android-toolbar


【解决方案1】:

这个视图好像没有ID

你是对的,the navigation view is created programmatically 并且从不设置 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);

结果

【讨论】:

  • 不错的解决方案。这个函数有什么作用?文档说“如果存在导航按钮,请为导航按钮设置内容描述。内容描述将通过屏幕阅读器或其他可访问性系统阅读,以解释导航按钮的操作。” .当您长按操作项时,它是为操作项显示的吐司吗?如果是这样,“向上”按钮会发生什么?此外,列表中的第一个视图是否总是“向上”按钮?即使还有其他人有这个价值?或者,因为您在菜单膨胀之前很久就调用它,所以这无关紧要?
  • 好的,我已经找到了所有问题,并且我已经更新了问题以保留完整答案。我这样做是因为您的答案是正确的,只是它错过了一些特殊处理。感谢您的帮助。
  • @androiddeveloper 当我说它默认没有内容描述时我错了。当然可以,我相应地编辑了我的答案。这是当有人打开无障碍服务并长按它时显示或说出的内容,是的。 View.findViewsWithText 遍历调用该方法的 View 的视图层次结构。它会根据标志找到每个带有您提供的文本或内容描述的View。但是导航视图的内容描述应该已经是唯一的,不需要那个循环。
  • 因为我不想改变任何视图的这个值,也不想发现误报(万一其他项目有这个值),我不得不添加这些操作。这应该适用于任何可能的情况。
  • 说,你知道我将如何使用支持 actionBar 吗?那里的 id 也不可用...
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多