Android 旋转后碎片字段为空
我有一个片段,在这里我调用自定义视图类(Dragger) 我还有另一个带有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
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);