Java 如何为FrameLayout中的多个视图创建浮动上下文菜单?
我正在以这种方式将视图添加到Java 如何为FrameLayout中的多个视图创建浮动上下文菜单?,java,android,android-fragments,nullpointerexception,Java,Android,Android Fragments,Nullpointerexception,我正在以这种方式将视图添加到FrameLayout中 frameLayout.post(new Runnable() { @Override public void run() { for (int i = 0; i < adapter.getCount(); i++) { View view = adapter.getView(i, null, frameLayout)
FrameLayout
中
frameLayout.post(new Runnable() {
@Override
public void run() {
for (int i = 0; i < adapter.getCount(); i++) {
View view = adapter.getView(i, null, frameLayout);
frameLayout.addView(view);
registerForContextMenu(view);
}
}
});
但是在onContextItemSelected
中,当我尝试访问它时,它是null
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.remove:
db.delete(selectedView.getID()); // Error selectedView is null
return true;
default:
return super.onContextItemSelected(item);
}
}
所有这些代码都在同一个片段类中
public class MyFragment {
private View selectedView;
// Code...
}
补充资料
不应为空,因为onContextItemSelected为空 在onCreateContextMenu之后调用,对吗selectedView
- 如果
声明为selectedView
,则不存在static
一切都很好李>NullPointerException
仅在frameLayout
结果为空时(frameLayout.getChildCount()) 不是onContextItemSelected
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.fragment_page_lesson_menu, menu);
selectedView = v;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if(selectedView == null){
return false;
}
if (item.getItemId() == R.id.remove) {
db.deleteLesson(selectedView.getId());
}
selectedView = null;
return true;
}
不清楚为什么要在
框架布局
中从适配器
堆叠一堆视图
,但似乎有多个片段的实例处于活动状态,不管是有意还是无意。对于每个活动的片段
,都会调用onContextItemSelected()
方法,直到返回true
以指示选择已被处理。如果一次只运行一个MyFragment
实例,那么应该找出其他实例的来源。否则,要确保上下文菜单适用于给定实例和视图
@MikeM,将需要一些繁琐的工作。非常感谢您的评论。我确实使用了FrameLayout
,因为我在做日历,而使用ListView
我无法很好地定位视图(view.setY
不起作用)。是的,片段有多个实例
,因为我使用的是ViewPager
。这就是问题所在。把selectedView
static
作为一个解决方案怎么样?是的,这可能大部分是可行的,但它有点黑客味,静态View
引用是一个普遍的禁忌。可能是一个更好的方法,但不是太单调,方法是在onContextItemSelected()中首先对selectedView
执行空检查
–如果为空,则返回false
,并设置selectedView=null代码>在onContextMenuClosed()
中。这样,您的设置selectedView=v
在onCreateContextMenu()
中,只有当前片段
应具有非空的selectedView
@MikeM。很有效,谢谢。这就是我想要的哎呀,我的建议错了。我注意到,正如我所建议的,您将onOptionsMenuClosed()
而不是onContextMenuClosed()
。我刚刚意识到Fragment
没有onContextMenuClosed()
方法,所以很明显你不能这么做,而且你的代码中还有一个微妙的bug。完全摆脱onOptionsMenuClosed()方法,并移动selectedView=null代码>到onContextItemSelected()
,使用后。您真的应该在案例
和默认案例
中都执行此操作,或者重构该案例,使其在结尾只有一个返回
语句,并在这之前执行此操作。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.fragment_page_lesson_menu, menu);
selectedView = v;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if(selectedView == null){
return false;
}
if (item.getItemId() == R.id.remove) {
db.deleteLesson(selectedView.getId());
}
selectedView = null;
return true;
}