Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.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
Android 旋转后碎片字段为空_Android_Android Fragments_Nullpointerexception_Rotation_Fragment - Fatal编程技术网

Android 旋转后碎片字段为空

Android 旋转后碎片字段为空,android,android-fragments,nullpointerexception,rotation,fragment,Android,Android Fragments,Nullpointerexception,Rotation,Fragment,我有一个片段,在这里我调用自定义视图类(Dragger) 我还有另一个带有RecyclerView和adapter的片段,在其中我通过CanvasFragment的主机活动调用CanvasFragment的方法addIconToCanvas() public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> { private int[] data; private Cont

我有一个片段,在这里我调用自定义视图类(Dragger)

我还有另一个带有
RecyclerView
和adapter的片段,在其中我通过
CanvasFragment
的主机活动调用
CanvasFragment的
方法
addIconToCanvas()

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    private int[] data;
    private Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView itemView;
        public ViewHolder(View v) {
            super(v);
            itemView = (ImageView) v.findViewById(R.id.im_item);
        }
    }

    public ItemAdapter(Context context, int[] myDataset) {
        data = myDataset;
        this.context = context;
    }

    @Override
    public ItemAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.itemView.setImageResource(data[position]);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            ((MainActivity)context).addItemToCanvas(data[position]);
            }
        });
    }

    @Override
    public int getItemCount() {
        return data.length;
    }
}
这样说:

androidConfigChanges: "keyboardHidden | orientation | screenSize"
在定义mainActivity的android xml文件中。像这样的

<activity
android:name="com.projectname.MainActivity"
android:label = "@string/title_activity_main"
</activity>

删除行setRetainInstance(true);从您的片段中,尝试使用该行

private CanvasFragment CanvasFragment=new CanvasFragment()

每次创建
活动
时,将
片段的新实例分配给变量canvasFragment。但仅当
savedInstanceState==null
将此CanvasFragment实例添加到UI时

只有在需要显示
Fragment
时,才会调用
Fragment
方法
onCreateView()
,因此在配置更改后,新创建的实例的dragger保持为null

你能做什么

如果要将CanvasFragment添加到UI,则仅创建其实例。如果
savedInstanceState!=null
,查找已存在的
片段
,如下所示:

<activity
android:name="com.projectname.MainActivity"
androidConfigChanges: "keyboardHidden | orientation | screenSize"
android:label = "@string/title_activity_main"
</activity>
canvasFragment = (CanvasFragment)getSupportFragmentManager().findFragmentById(R.id.container_canvas);

对但这有助于我在屏幕旋转时保留对所有已创建对象的引用。这一行是在第一次崩溃后添加的。因此,在main活动中,设备方向更改后,savedInstanceState将不会为null。因此,“if check”中的语句将不会在设备定向后执行。你能把活动的全部代码贴出来吗?我已经编辑了这个问题。有完整的主机活动代码。我不认为这是一个解决办法。setRetainInstance(true)不应用于在UI中保留片段。它可以用来保留无状态片段,以便在方向更改后保存大数据。因此,在改变方向的过程中,必须销毁碎片,并在改变方向后添加新碎片。因此,如果必须删除(savedInstanceState==null)检查,以在方向更改后添加新片段。:)此外,使用setRetainInstance(true)可能会导致活动泄漏。看看这个。
<activity
android:name="com.projectname.MainActivity"
androidConfigChanges: "keyboardHidden | orientation | screenSize"
android:label = "@string/title_activity_main"
</activity>
canvasFragment = (CanvasFragment)getSupportFragmentManager().findFragmentById(R.id.container_canvas);