旋转设备时,RecyclerView/MapView崩溃

tal*_*aul 2 android google-maps android-mapview xamarin android-recyclerview

我有一个Android.Support.V4.Fragment包含a MapView和a的RecyclerView.这些是单独的观点Fragment.

设备旋转时应用程序崩溃:

Android.OS.BadParcelableException:解组时的ClassNotFoundException:android.support.v7.widget.RecyclerView $ SavedState

我按照文档的要求将生命周期方法传递给MapView:

private MapView mapView;
private RecyclerView myRecyclerView;
private RecyclerView.LayoutManager myLayoutManager;

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView(inflater, container, savedInstanceState);

    myRecyclerView = myRootView.FindViewById<RecyclerView>(Resource.Id.myRecyclerView);
    myLayoutManager = new LinearLayoutManager(activity, LinearLayoutManager.Horizontal, false);
    myRecyclerView.SetLayoutManager(myLayoutManager);
    myRecyclerAdapter = ...
    myRecyclerView.SetAdapter(myRecyclerAdapter);

    mapView.OnCreate(savedInstanceState);
}


public override void OnSaveInstanceState(Bundle outState)
{
    ...
    if (mapView != null) mapView.OnSaveInstanceState(outState);
    base.OnSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)

如果我删除RecyclerView表单AXML它正确旋转,如果我包含它应用程序崩溃mapView.OnCreate(savedInstanceState)为什么这?

tal*_*aul 5

对于任何搜索并具有相同问题的人.这是解决方案,它似乎是一个2岁的bug.

我能够通过将MapView的保存状态保存在单独的Bundle上然后将其添加到传出的已保存状态包中来解决它.然后onCreate(),我将从传入的一个中获取MapView的保存状态并将其传递给它的onCreate()方法,从而停止崩溃.

在我的情况下,我实现如此:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    base.OnCreateView(inflater, container, savedInstanceState);

    myRecyclerView = myRootView.FindViewById<RecyclerView>(Resource.Id.myRecyclerView);
    myLayoutManager = new LinearLayoutManager(activity, LinearLayoutManager.Horizontal, false);
    myRecyclerView.SetLayoutManager(myLayoutManager);
    myRecyclerAdapter = ...
    myRecyclerView.SetAdapter(myRecyclerAdapter);

    Bundle mapViewSavedInstanceState = savedInstanceState != null ? savedInstanceState.GetBundle("mapViewSaveState") : null;
    mapView.OnCreate(mapViewSavedInstanceState); 
}


public override void OnSaveInstanceState(Bundle outState) 
{
    if (mapView != null)
    { 
        Bundle mapViewSaveState = new Bundle(outState);
        outState.PutBundle("mapViewSaveState", mapViewSaveState);
        mapView.OnSaveInstanceState(outState);

    }
    base.OnSaveInstanceState(outState); 
}
Run Code Online (Sandbox Code Playgroud)