2

Android.Support.V4.Fragmentには、MapViewRecyclerViewの両方が含まれています。これらは、Fragmentの別個のビューです。 デバイスを回転させるとRecyclerView/MapViewがクラッシュする

アプリがクラッシュ

デバイスを回転させたとき:

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

私はAXML RecyclerViewフォームを削除した場合、それ私がそれを含めると正しく回転するmapView.OnCreate(savedInstanceState)でアプリがクラッシュするなぜですか?

答えて

3

検索して同じ問題が発生した場合は、 This is the solution、それは2歳のバグであるようです。

マップビューの保存状態を別のバンドルに保存してから、送信保存状態バンドルに追加することで回避できました。次に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); 
} 
+1

今後の参考のため、解答に最も関連する部分を含めることができますか? – antonio

+0

@antonio投稿を更新しました。 – tallpaul

0

Tallpaulの答えは私のために動作しませんでした。彼が結んだ解決策はうまくいっていた。

public class FragmentMain extends Fragment { 

    private Bundle savedInstanceState; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ... 

     this.savedInstanceState = savedInstanceState; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     containerView = inflater.inflate(R.layout.fragment_main, container, false); 

     //mapView bug https://code.google.com/p/gmaps-api-issues/issues/detail?id=6237#c9 
     final Bundle mapViewSavedInstanceState = 
      savedInstanceState != null ? 
       savedInstanceState.getBundle("mapViewSaveState") : null; 

     vmGoogleMap.create(mapViewSavedInstanceState ; 


     return containerView; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 

     //mapView bug https://code.google.com/p/gmaps-api-issues/issues/detail?id=6237#c9 
     final Bundle mapViewSaveState = new Bundle(outState); 
     vmGoogleMap.onSaveInstanceState(mapViewSaveState); 
     outState.putBundle("mapViewSaveState", mapViewSaveState); 

     super.onSaveInstanceState(outState); 
    } 

} 
関連する問題