1

フラグメントがあり、画面の回転のために、いくつかの状態を保存したい

@Override
public void onSaveInstanceState(Bundle bundle)
{
    super.onSaveInstanceState(bundle);
    bundle.putSerializable("myList", myList);
    bundle.putString("test", "test");
 }

必要なデータを保存するために、デバッガーでコードが少なくとも呼び出されていることを確認してから、持っているデータを取得することができます

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

    if(savedInstanceState != null)
    {
        //do something        
    }
    else
    {
        //do something else
    }
}

しかし、ここで私はいつも私のifステートメントのelse-brachになります。なぜnullなのかわかりません。ありがとう。

EDIT は、最初の回答に加えて次のようにコードを変更しました。

画面を回転させると、デバッガーに次のように表示されます。

  1. onSaveInstanceStateが呼び出されます
  2. onCreateは->bundle!=nullと呼ばれます
  3. onCreateが再度呼び出されます(理由)-> bundle = null
  4. onCreateActivityは呼び出されます->bundle= null

編集2 私はタブについての同様の投稿を見つけました、そこでそれらは切り離されました、そしてそれはそれが二度呼ばれる理由です。私はこれらの投稿を完全に理解していないことを認めなければなりません...しかし、それはそれに関連している可能性があります。私のアクティビティには、次のコードがあります

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    OverviewFragment of = new OverviewFragment();
    FragmentTransaction tof = getFragmentManager().beginTransaction();

    tof.replace(R.id.frag_overview, of);
    DetailFragmentInitial df = new DetailFragmentInitial();
    tof.replace(R.id.frag_details, df);
    tof.commit();

}

どういうわけかそれを変更する必要があるかもしれません...しかし、私にはわかりません... savedInstaceStateがnullの場合にのみフラグメントトランザクションを実行すると、機能しているように見えます。しかし、後で別の問題が発生するかどうかはわかりません。誰かこれに関する背景知識はありますか?

4

1 に答える 1

3

視認性を高めるために、@ AndyAndroidの実用的なソリューションを以下に示します(彼のコメントで概説されています)。

答えは、編集2でフラグメントトランザクションを囲み、 if(getFragmentManager().findFragmentByTag("overviewFrag") == null)もちろんタグを設定することです。


同じトピックに関する古い質問があります。これはここにあります:インスタンス状態の保存を使用したAndroidアクティビティ状態の保存

(受け入れられた回答の)コードとあなたのコードの違いを概説するために、この例では、独自の値をバンドルに入れる前にスーパーメソッドを呼び出します。

@jkschneiderからのコメントはこれを概説しています:

注意:バンドルに値を追加する前に、 super.onSaveInstanceState(savedInstanceState)を呼び出す必要があります。そうしないと、その呼び出しで値が消去されます(Droid X And​​roid2.2)。


一般的なアドバイスとして、@Overrideコンパイル時のセキュリティを確保するために、上書きされたメソッドには常に-annotationでアノテーションを付けてください。詳細については、次を参照してください。Javaの@Overrideアノテーションを使用するのはいつですか。その理由は何ですか。


これが役立つかもしれないいくつかのより関連した質問です:

他の2つの質問のOPでも機能するように見えるので、最後の回答で指定されたコードが機能するかどうかを確認します。

于 2012-08-14T10:30:47.473 に答える