1. ホーム
  2. android

savedInstanceState が常に null である。

2023-08-12 02:07:42

質問

これは私のsavedInstaceStateのコードです。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
    savedInstanceState.putStringArrayList("todo_arraylist", Altodo);
    Log.v("bundle", "Saved");
    super.onSaveInstanceState(savedInstanceState);
}


public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) 
    {
        Altodo = savedInstanceState.getStringArrayList("todo_arraylist");
        Log.v("bundle", "Restored");
    }
    else
    {
        Log.v("bundle", "null");
    }

    setContentView(R.layout.main);
}

ログには常に "bundle save" タグが表示されます。

しかし onCreate メソッドで SavedInstanceState は常に null です。

どのように解決するのですか?

私はまったく同じ症状 (以下のように報告されています) を観察しました。 問題 133394 として報告されています) とまったく同じ症状が、2 つのアクティビティからなるプロジェクトで発生しました。 A B を拡張する ActionBarActivity . アクティビティ A がメインのアクティビティで、いつも受け取る null に対して savedInstanceStateonCreate から戻ってきたときに、そのリストフラグメントの B . 何時間も経った後、この問題は、偽装されたナビゲーションの問題であることが私に明らかになりました。

以下は、私のセットアップに関連するもので、このページの他の回答から来たものである可能性があります。

  • 与えられた この の回答があったので、フラグメントとアクティビティにそれぞれユニークなIDが設定されていることを確認しました。
  • のオーバーライドはありません。 onSaveInstanceState がなければ super を呼び出します。
  • 活動内容 A はacitivyとして指定されます。 B の親である AndroidManifest.xml の両方を使って android:parentActivityName 属性と、それに対応する meta-data タグを使用することができます(" アップナビゲーションの提供 ")を参照してください。

などの対応する作成コードなしですでに getActionBar() .setHomeButtonEnabled(true) 活動 B は、戻るボタンが機能している ( < )があります。このボタンがタップされると、アクティビティ A が再表示されるが (a) で、以前のインスタンスの状態はすべて失われます。 (b) onCreate は常に呼び出され (c) savedInstanceState 常に null .

面白いことに、エミュレータのディスプレイの下端に用意された戻るボタン(左向きの三角形が開いたもの)をタップすると、アクティビティ A を呼び出すことなく、そのまま (すなわち、そのインスタンス状態が完全に保持された状態で) 再表示されます。 onCreate . だから、多分ナビゲーションに何か問題があるのでしょうか?

その後 もっと読む で、戻るボタンがタップされたときに実行される独自のナビゲーション命令を実装しました。 B :

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home)
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

アクティビティのインスタンス状態の復元に関連するものはありません A を変更しました。 NavUtils もメソッドを提供します。 getParentActivityIntent(Activity)navigateUpTo(Activity, Intent) というアクティビティを明示的に指示するために、ナビゲーションインテントを修正することができます。 A を設定することで、アクティビティが新しく開始されない(つまり、保存されたインスタンス状態が提供されない)ように、ナビゲーションインテントを変更することができます。 FLAG_ACTIVITY_CLEAR_TOP フラグを設定することで

もし設定されていて、起動されるアクティビティがすでに現在のタスクで実行されている場合 現在のタスクで実行されている場合、そのアクティビティの新しいインスタンスが起動されるのではなく アクティビティの新しいインスタンスを起動する代わりに、その上にある他のすべてのアクティビティが閉じられ このIntentは、新しいIntとして(今トップにある)古いアクティビティに配信されます。 新しいIntentとして(今トップの)古いアクティビティに配信されます。

私の手元では、これはインスタンスの状態が失われる問題を解決し、次のように見えるかもしれません。

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        Intent intent = NavUtils.getParentActivityIntent(this);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, intent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

これは、ユーザーが直接アクティビティに切り替えることができる他のケースでは、完全な解決策にならないかもしれないことに注意してください。 B に直接切り替えられるようなケースでは、完全な解決策とはならないかもしれません。 はこちら ). また、同じような動作で NavUtils を利用しないビヘイビアでは、単に finish() :

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

どちらの解決策も私の手元では動作します。元の問題は、戻るボタンのデフォルトの実装がわずかに間違っていることで、その実装がある種の navigateUp を呼び出すことに関係しているのかもしれません。 FLAG_ACTIVITY_CLEAR_TOP .