Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为FrameLayout中的多个视图创建浮动上下文菜单?_Java_Android_Android Fragments_Nullpointerexception - Fatal编程技术网

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...

}
补充资料

  • selectedView
    不应为空,因为onContextItemSelected为空 在onCreateContextMenu之后调用,对吗
  • 如果
    selectedView
    声明为
    static
    ,则不存在
    NullPointerException
    一切都很好
  • frameLayout
    仅在
    onContextItemSelected
    结果为空时(frameLayout.getChildCount()) 不是
来自Mike M.comment

问题是MyFragment存在多个实例,因为它位于ViewPager中。(前面的代码在没有ViewPager的情况下工作)

现在的工作代码是:

    @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;
    }