Android工具栏溢出菜单视图ID

时间:2017-03-22 14:47:59

标签: android

我要做的是显示指向工具栏上溢出图标(三个点)的PopupWindow。所以我需要使用图标的id来获取对View对象的引用。但是id是什么?

PopupWindow用于告诉用户溢出菜单中添加了新条目。并建议用户查看。

6 个答案:

答案 0 :(得分:4)

溢出菜单项没有资源ID。我通过遍历工具栏找到了溢出视图。调试器显示id为def response = testRunner.testCase.getTestStepByName("xxx").getProperty("Response").getValue() def parsedxml = new XmlSlurper().parseText(response) def hotelName = parsedxml.'soap:Body'.HotelAvailResponse[0].xxx[0].Results[0].xxxx[0].xxx[0].Name[0].toString() ,层次结构查看器显示没有资源ID。

以下是我如何找到没有资源ID的溢出视图:

-1

调用/** * Get the OverflowMenuButton. * * @param activity * the Activity * @return the OverflowMenuButton or {@code null} if it doesn't exist. */ public static ImageView getOverflowMenuButton(Activity activity) { return findOverflowMenuButton(activity, findActionBar(activity)); } static ImageView findOverflowMenuButton(Activity activity, ViewGroup viewGroup) { if (viewGroup == null) { return null; } ImageView overflow = null; for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) { View v = viewGroup.getChildAt(i); if (v instanceof ImageView && (v.getClass().getSimpleName().equals("OverflowMenuButton") || v instanceof ActionMenuView.ActionMenuChildView)) { overflow = (ImageView) v; } else if (v instanceof ViewGroup) { overflow = findOverflowMenuButton(activity, (ViewGroup) v); } if (overflow != null) { break; } } return overflow; } static ViewGroup findActionBar(Activity activity) { try { int id = activity.getResources().getIdentifier("action_bar", "id", "android"); ViewGroup actionBar = null; if (id != 0) { actionBar = (ViewGroup) activity.findViewById(id); } if (actionBar == null) { return findToolbar((ViewGroup) activity.findViewById(android.R.id.content).getRootView()); } } catch (Exception e) { e.printStackTrace(); } return null; } static ViewGroup findToolbar(ViewGroup viewGroup) { ViewGroup toolbar = null; for (int i = 0, len = viewGroup.getChildCount(); i < len; i++) { View view = viewGroup.getChildAt(i); if (view.getClass() == android.support.v7.widget.Toolbar.class || view.getClass().getName().equals("android.widget.Toolbar")) { toolbar = (ViewGroup) view; } else if (view instanceof ViewGroup) { toolbar = findToolbar((ViewGroup) view); } if (toolbar != null) { break; } } return toolbar; } 将在getOverflowMenuButton(activity)中返回null,因为尚未列出溢出菜单。要获得onCreate中的溢出菜单,我执行了以下操作:

onCreate

答案 1 :(得分:3)

您应该创建按钮 id

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="overflowActionButton"/>
</resources>

然后创建按钮样式

<style name="Widget.ActionButton.Overflow" parent="Widget.AppCompat.ActionButton.Overflow">
    <item name="android:id">@id/overflowActionButton</item>
</style>

并在主题中添加此样式

<style name="Theme.App" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style>

enter image description here

最后你应该通过 id 找到按钮视图

activity.findViewById(R.id.overflowActionButton)

做你想做的事

答案 2 :(得分:0)

您想要创建自定义DropDown菜单吗? consider this "native" way

或在android:showAsAction="never"中使用menu.xmlshowAsAction属性HERE的文档。当其中一个MenuItem已设置never值时,您将自动获得溢出的三点图标,这些MenuItem将隐藏在那里

如果确实需要,您也可以尝试使用Hierarchy Viewer来调查此ID

答案 3 :(得分:0)

我找到了一个名为TapTarget的库和一个函数TapTarget.forToolbarOverflow()。它提出了一个解决方案:https://github.com/KeepSafe/TapTargetView/blob/master/taptargetview/src/main/java/com/getkeepsafe/taptargetview/TapTarget.java#L96

它如何找到溢出视图的方式并不整齐,但应该是稳定的。

答案 4 :(得分:0)

我没有使用昂贵且复杂的布局遍历来查找溢出菜单,而是通过使用工具栏视图作为锚点并将重力设置为Gravity实现了在溢出菜单下显示PopupWindow。END:

 /**
  * Sets the anchor view and shows the popup. In case of narrow display the menu items may be hidden in an overflow
  * menu, in that case anchorView may be null and the popup will be anchored to the end of the toolbar.
  */
 public void show(@Nullable View anchorView, @NonNull View toolbarView) {
     if (anchorView == null) {
         setDropDownGravity(Gravity.END);
         setAnchorView(toolbarView);
     } else {
         setAnchorView(anchorView);
     }
     show();
 }

答案 5 :(得分:-2)

您可能在菜单资源中创建了一个菜单项xml以具有溢出按钮,因此您必须使用在菜单xml中指定的溢出按钮项的ID