我要做的是显示指向工具栏上溢出图标(三个点)的PopupWindow。所以我需要使用图标的id来获取对View对象的引用。但是id是什么?
PopupWindow用于告诉用户溢出菜单中添加了新条目。并建议用户查看。
答案 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>
最后你应该通过 id 找到按钮视图
activity.findViewById(R.id.overflowActionButton)
做你想做的事
答案 2 :(得分:0)
您想要创建自定义DropDown
菜单吗? consider this "native" way
或在android:showAsAction="never"
中使用menu.xml
。 showAsAction
属性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