我有一个PopupWindow
我想锚定到一个操作栏菜单项,但似乎无论如何都无法获得View
我想要单击的项目。这是该PopupWindow
showAsDropDown()
方法所必需的。
有谁知道如何实现这一目标?
我有一个PopupWindow
我想锚定到一个操作栏菜单项,但似乎无论如何都无法获得View
我想要单击的项目。这是该PopupWindow
showAsDropDown()
方法所必需的。
有谁知道如何实现这一目标?
您可以使用菜单项 id 获取视图,方法是在onOptionsItemSelected
..
findViewById(R.id.menu_item);
findViewById 不必在 onOptionsItemSelected 上运行以获取操作项的视图。
但是,请注意,有时操作项会位于溢出菜单内,因此您可能会得到一个空值。
那么,你怎么能做到呢?
这是一个示例代码:
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 库上使用,here。
每个地方都调用:
activity.findViewById(R.id.menu_item);
如果您在片段中的代码不使用:
getView().findViewById(R.id.menu_item);
它将返回null。
我也遇到了这个问题, 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 线程中运行
只需调用findViewById
(您的菜单 ID),但请记住不要调用,OnCreate(...)
因为此时菜单没有膨胀,而是调用它onOptionsItemSelected