Java 恢复包含地图的片段中对象的可包裹数组列表
我有一个包含地图的片段。片段使用对象的arraylist作为从其父对象接收的标记的位置和描述。问题是,即使我将arraylist保存在bundle的onSaveInstanceState中,并在onCreate中再次检索它,也会弹出以下错误Java 恢复包含地图的片段中对象的可包裹数组列表,java,android,google-maps,android-fragments,Java,Android,Google Maps,Android Fragments,我有一个包含地图的片段。片段使用对象的arraylist作为从其父对象接收的标记的位置和描述。问题是,即使我将arraylist保存在bundle的onSaveInstanceState中,并在onCreate中再次检索它,也会弹出以下错误 05-07 15:39:55.453: E/Parcel(24252): Class not found when unmarshalling: com.ictcsu.DatabaseClasses.sentdata, e: java.lang.ClassN
05-07 15:39:55.453: E/Parcel(24252): Class not found when unmarshalling: com.ictcsu.DatabaseClasses.sentdata, e: java.lang.ClassNotFoundException: com.ictcsu.DatabaseClasses.sentdata
05-07 15:39:55.453: D/AndroidRuntime(24252): Shutting down VM
05-07 15:39:55.453: W/dalvikvm(24252): threadid=1: thread exiting with uncaught exception (group=0x40fe72a0)
05-07 15:39:55.473: E/AndroidRuntime(24252): FATAL EXCEPTION: main
05-07 15:39:55.473: E/AndroidRuntime(24252): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ictcsu.testapp1/com.ictcsu.viewdata.Activity_Viewdata}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.ictcsu.DatabaseClasses.sentdata
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3568)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread.access$700(ActivityThread.java:134)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.os.Looper.loop(Looper.java:137)
05-07 15:39:55.473: E/AndroidRuntime(24252): at android.app.ActivityThread.main(ActivityThread.java:4830)
05-07 15:39:55.473: E/AndroidRuntime(24252): at java.lang.reflect.Method.invokeNative(Native Method)
05-07 15:39:55.473: E/AndroidRuntime(24252): at java.lang.reflect.Method.invoke(Method.java:511)
05-07 15:39:55.473: E/AndroidRuntime(24252): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
05-07 15:39:55.473: E/AndroidRuntime(24252): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
05-07 15:39:55.473: E/AndroidRuntime(24252): at dalvik.system.NativeStart.main(Native Method)
05-07 15:39:55.473: E/AndroidRuntime(24252): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.ictcsu.DatabaseClasses.sentdata
它说即使我的类确实存在,也找不到它!。这是我的片段代码
public class Fragment_map extends Fragment{
private static final String TAG = Fragment_map.class.getSimpleName();
private static final String MYLIST = "myList";
List<Marker> markers = new ArrayList<Marker>();
MapView mMapView;
private static GoogleMap googleMap;
private selector selectorListener;
private static ArrayList<sentdata> data = new ArrayList<sentdata>();
private Boolean mInitialCreate;
public static Fragment_map newInstance(ArrayList<sentdata> _data){
Log.i(TAG, "List Size:" + _data.size());
Fragment_map newfragment_map = new Fragment_map();
Bundle args = newfragment_map.getArguments();
if(args==null){
args = new Bundle();
}
args.putParcelableArrayList(MYLIST, _data);
newfragment_map.setArguments(args);
return newfragment_map;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Fragment parentFragment = getParentFragment();
if (parentFragment != null && parentFragment instanceof selector) {
selectorListener = (selector) parentFragment;
}
else if (activity != null && activity instanceof selector) {
selectorListener = (selector) activity;
}
else if (selectorListener == null) {
Log.w(TAG, "onAttach: niether the parent fragment or parent activity implement OnImageSelectedListener, "
+ "image selections will not be communicated to other components");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//super.onCreate(savedInstanceState);
Log.w(TAG, "here in OCREATE Of map");
Bundle args = getArguments();
if (args != null) {
data = args.getParcelableArrayList(MYLIST);
}
if (savedInstanceState != null) {
data = savedInstanceState.getParcelableArrayList(MYLIST);
if(data.size()!=0){
for(int i=0; i< data.size(); i++){
Log.w(TAG,data.get(i).gettmp());
}
}
mInitialCreate = false;
}else {
mInitialCreate = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_map, container, false);
mMapView = (MapView) rootView.findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
mMapView.onResume();// needed to get the map to display immediately
try {
MapsInitializer.initialize(getActivity().getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
googleMap = mMapView.getMap();
googleMap.setOnMarkerClickListener(new OnMarkerClickListener()
{
@Override
public boolean onMarkerClick(Marker arg0) {
for(int i=0; i< markers.size();i++){
if(arg0.equals(markers.get(i))){ // if marker source is clicked
Log.w(TAG,"Clicked");
selectorListener.setlist(i);
}
// display toast;
}
return true;
}
});
if(data.size()!=0 && data !=null){
setmap();
}
if (mInitialCreate) {
mInitialCreate = false;
}
return rootView;
}
public void setmap(){
for(int i=0; i<data.size();i++){
double lat = Double.parseDouble(data.get(i).getlat());
double longt = Double.parseDouble(data.get(i).getlong());
Marker marker = googleMap.addMarker(new MarkerOptions()
.title("Hello Maps")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE))
.position(new LatLng(lat, longt)));
// Changing marker icon
// marker.showInfoWindow();
// adding marker
markers.add(marker);
}
markers.get(0).showInfoWindow();
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(Double.parseDouble(data.get(0).getlat()), Double.parseDouble(data.get(0).getlong()))).zoom(75).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
}
public void setview(double lat, double longt, int num){
//MarkerOptions marker = new MarkerOptions().position(
// new LatLng(lat, longt)).title("Hello Maps");
// Changing marker icon
//marker.icon(BitmapDescriptorFactory
// .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
// adding marker
//googleMap.addMarker(marker);
Log.i(TAG, "___Check data:"+ num);
for(int i=0;i<markers.size();i++){
markers.get(i).hideInfoWindow();
}
markers.get(num).showInfoWindow();
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(Double.parseDouble(data.get(num).getlat()), Double.parseDouble(data.get(num).getlong()))).zoom(90).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
data = savedInstanceState.getParcelableArrayList(MYLIST);
mInitialCreate = false;
}
Log.v(TAG, "onActivityCreated");
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
Log.v(TAG, "onViewStateRestored");
}
@Override
public void onStart() {
super.onStart();
Log.v(TAG, "onStart");
}
@Override
public void onStop() {
super.onStop();
Log.v(TAG, "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.v(TAG, "onDestroyView");
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.v(TAG, "onSaveInstanceState");
outState.putParcelableArrayList(MYLIST, data);
super.onSaveInstanceState(outState);
}
公共类片段\u映射扩展片段{
private static final String TAG=Fragment_map.class.getSimpleName();
私有静态最终字符串MYLIST=“MYLIST”;
列表标记=新的ArrayList();
地图视图;
私有静态谷歌地图;
专用选择器或侦听器;
私有静态ArrayList数据=新ArrayList();
私有布尔最小创建;
公共静态片段映射新实例(ArrayList数据){
Log.i(标记,“列表大小:”+_data.Size());
Fragment_-map newfragment_-map=新片段_-map();
Bundle args=newfragment_map.getArguments();
如果(args==null){
args=newbundle();
}
args.putParcelableArrayList(MYLIST,_数据);
newfragment_map.setArguments(args);
返回newfragment\u映射;
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
片段parentFragment=getParentFragment();
if(parentFragment!=选择器的null&&parentFragment实例){
selectorListener=(选择器)parentFragment;
}
else if(活动!=null&&activity实例选择器){
selectorListener=(选择器)活动;
}
else if(selectorListener==null){
w(标记“onAttach:niether父片段或父活动实现OnImageSelectedListener,”
+“图像选择将不会传达给其他组件”);
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//super.onCreate(savedInstanceState);
Log.w(标记“在地图的OCREATE中”);
Bundle args=getArguments();
如果(args!=null){
data=args.getParcelableArrayList(MYLIST);
}
如果(savedInstanceState!=null){
data=savedInstanceState.getParcelableArrayList(MYLIST);
如果(data.size()!=0){
对于(int i=0;i 对于(int i=0;i您应尝试使用:
args.setClassLoader(sentData.getClassLoader())
在您获取数据之前为什么不使用SharedReferences?我使用的是一个对象列表,该对象包含多个数据,因此使用SharedReferences可能没有效率,并且用户单击其他片段时对象的ArrayList是可更新的。感谢您的回复。我按照您的回答设置了我的捆绑包,但它没有更改什么都可以,还是有同样的错误。
args.setClassLoader(sentData.getClassLoader())