11

アクションバータブのあるアクティビティがあります。各タブにはフラグメントが含まれています。デバイスをローテーションすると、対応するフラグメントのバンドルが null になります。これは、Android 3.2 以降のデバイスを使用している場合は注意が必要ですが、デバイスが Andoird3.0 の場合に発生しています。この問題に取り組んだ後、頭痛がします。SOのさまざまなリンクをチェックしましたが、助けにはなりません。十分な詳細を説明しましたが、さまざまなケースでユーザーがコード スニペットを要求するため、いくつかのコード スニペットを提供します。

私のフラグメントクラスでは、この値を保存しています

 @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putBoolean("textboxVisible", true);
    }

これは、以下のように取得した 1 つのブール変数を格納しています。

/**
 * Function called after activity is created. Use this
 * method to restore the previous state of the fragment
 */
     @Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) 
    {
        //restore the state of the text box
        boolean textboxVisible = savedInstanceState.getBoolean("textboxVisible");
        if (textboxVisible) 
        {
            //do some stuff
        }                   
    }
}

しかし、ローテーション後、savedInstanceStateは null になります。何が悪いのかわかりません。3.2 以下では、フラグメントの onCreateView() がバンドル値で呼び出されないというドキュメントを読みました。しかし、これに対処するために。どんな助けでも大歓迎です。

4

2 に答える 2

4

setRetainInstance(true) を使用すると、方向が変更された後、savedInstance バンドルは常に null になります。だから実際には何かを保存することはできませんが、何かを保存する必要がある場合にできることは、フラグメントのデータメンバーに入れることです.setRetainInstance(true)はフラグメントを保持し、それを破壊しないため、その後デバイスが回転されたので、同じ値になります。

于 2013-03-05T20:17:40.993 に答える
3

の を取得してみsavedInstanceStateonCreateくださいFragment。お気に入り

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

        if (savedInstanceState != null) {
            // IT MUST NOT BE NULL HERE
        }
    }

試してください...うまくいくことを願っています

于 2012-12-11T09:55:28.597 に答える