0

この質問はよくあることですが、私は非常に多くの回答を読んでいますが、私の問題にはまったく当てはまりません。私のアプリケーションでは、私にはアクティビティがあり、rhyeのアクティビティでは、フラグメントをロードします。私はまた断片にいくつかのデータを(Bundleの形で)送る。だから私の問題は、画面が回転したときに、フラグメントをonSaveInstanceStateに保存します。アクティビティのメソッドとチェックインonCreateメソッドweather savedInstanceがnullであるかどうか、そしてその基準でフラグメントをロードします。 アクティビティコード:画面上のカスタムオブジェクトをフラグメントまたはアクティビティに保存する

@Override 
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
    super.onSaveInstanceState(outState, outPersistentState); 
    outState.putParcelable(Const.TAG_REQ_CUSTOM,DetailsItems); 
    outState.putString(Const.TAG_FLOW, Const.TAG_MAIN_FLOW); 
    getSupportFragmentManager().putFragment(outState,"current_fragment",fragment); 
} 

のonCreateメソッド:

if (findViewById(R.id.fragment_frame) != null) { 
     if (savedInstanceState != null) { 
// this invoke when screen rotate but the app crash 

      DetailsItems = savedInstanceState.getParcelable(Const.TAG_REQ_CUSTOM); 
      String flow = savedInstanceState.getString(Const.TAG_FLOW); 
      ft = getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment"); 
      mFragmentManager=getSupportFragmentManager(); 
      mFragmentTransaction = mFragmentManager.beginTransaction(); 
      bundle= new Bundle(); 
      bundle.putString(Const.TAG_FLOW, flow); 
      bundle.putParcelable(Const.TAG_REQ_BOOKING_DETAILS, bookingDetailsItems); 
      ft.setArguments(bundle); 
      mFragmentTransaction.replace(R.id.fragment_frame, ft).commit(); 
     }else{ 
      // load fragment on first time 
     } 
    } 

だから私の質問です:どこで(親アクティビティまたはフラグメントで)カスタムオブジェクトを保存する必要がありますか? 私の保存されたインスタンスは、アプリのcrasheshおよびログよりもnullではないです。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference 

答えて

0

使用の活動でこのコード:

if (findViewById(R.id.fragment_frame) != null) { 
     if (savedInstanceState != null) { 
fragment =getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment"); 

     }else{ 
      // load fragment on first time 
     } 
    } 

とフラグメントには:

//save custom object 

@Override 
    public void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     outState.putParcelable("key",customObject); 
    } 

//now retrieve here 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState != null) 
    customObject= savedInstanceState.getParcelable("key"); 
} 
+0

これはオブジェクトが 'Parcelable'インターフェースを実装しているのに対し、OPは任意のオブジェクトを保存/復元する方法を尋ねていると仮定しています。 – azizbekian

0

は、ドキュメントからonRetainNonConfigurationInstance()getLastNonConfigurationInstance()

を見てみましょう:システムによって呼び出され

、の一環として、新しい構成の新しいインスタンスがすぐに作成されることがわかっている場合、構成の変更によるアクティビティの破棄、アクティビティインスタンス自体を含め、ここで好きなオブジェクトを返すことができます。これは、後でgetLastNonConfigurationInstance()を新しいアクティビティインスタンスに呼び出すことで取得できます。

+0

私は自分のカスタムオブジェクトをアクティビティまたはフラグメントに保存しました。 – techDigi

+0

docsリンクからわかるように、これらのメソッドは 'Activity'で定義されています。 – azizbekian

0

あなたはViewModelを使用する必要があります。具体的にはViewModelが作成されています。ドキュメントから

ViewModelには、活動またはフラグメントのためのデータを準備し、管理を担当するクラスです。また、アクティビティ/フラグメントと他のアプリケーションとの通信(例えば、ビジネスロジッククラスの呼び出し)を処理する。

関連する問題