我想要一个PopupWindow
锚定到一个操作栏菜单项,但无论如何都无法获得我要点击的项目的View
。
这是PopupWindow
showAsDropDown()
方法所必需的。
有谁知道如何实现这个目标?
答案 0 :(得分:40)
您可以使用菜单项ID获取视图,方法是在onOptionsItemSelected
..
findViewById(R.id.menu_item);
答案 1 :(得分:33)
不必在onOptionsItemSelected上运行findViewById以获取操作项的视图。
然而,请注意有时候动作项会出现在溢出菜单中,所以你可能会得到一个null。
所以,你怎么能这样做?
这是一个示例代码:
public boolean onCreateOptionsMenu(final Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
new Handler().post(new Runnable() {
@Override
public void run() {
final View menuItemView = findViewById(R.id.menu_action_item);
...
在Android 4.1.2和android 2.3.5上使用actionBarSherlock库时进行了测试。
另一种方法是使用更广泛的方式,在showcaseView library,here上使用。
答案 2 :(得分:1)
我也遇到这个问题,findViewById应该在我这边工作,这里是示例代码:
private void setDrawable(final Menu menu) {
if (menu == null || menu.size() == 0) return;
Utils.postToUiHandler(new Runnable() {
@Override
public void run() {
int size = menu.size();
for (int i = 0; i < size; i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem != null) {
View view = activity.findViewById(menuItem.getItemId());
if (view != null) {
Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton();
if (drawable != null && view.getBackground() != drawable) {
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
view.setBackgroundDrawable(drawable);
} else {
view.setBackground(drawable);
}
}
}
}
}
}
});
}
请注意,我在UI线程中创建findViewById,因为menuitem'视图没有膨胀,所以 应该在UI线程中运行
答案 3 :(得分:0)
只需致电findViewById
(您的菜单ID)
但请记住不要调用oncreate,因为此时菜单并没有膨胀,但是
用onOptionsItemSelected
答案 4 :(得分:-1)
致电的地方:
activity.findViewById(R.id.menu_item);
如果片段中的代码不使用:
getView().findViewById(R.id.menu_item);
它将返回 null 。