web-dev-qa-db-ja.com

SavedInstanceStateはフラグメントでは常にnullです

XML(およびアクティビティのsetContentView())を使用してアクティビティに添付されたフラグメントがあります。フラグメントに非常に動的なビューがあるため、Aに問題があります。そのため、向きが変わると、ビューのすべての状態を復元する必要があります。

私はそのようなものを使用しているので問題があります:

public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("restore", true);
        outState.putInt("nAndroids", 2);
   }

しかし、param Bundle savedInstanceStateのメソッドが呼び出されたときに方向が変更された後(onCreateViewなど)、savedInstanceStateは常にnullです。

私はAndroidの初心者ではありませんが、この問題のために今非常に怒っています...

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if (savedInstanceState == null) {
        //smth
    } else {
        // smthelse THIS IS NEVER REACHED BECAUSE BUNDLE IS ALWAYS NULL
    }

    getListView().setDivider(getResources().getDrawable(R.drawable.list_divider));
}
32
TommyNecessary

すべての問題は、XMLのフラグメントに対してAndroid:idを宣言していないことです。 Androidは、保存されたフラグメントを認識し、その中のすべての要素を再現するためにIDまたはTAGを必要とします。

また、setRetainInstance(true)が宣言されている場合、バンドルは常にnullを返す必要があります。

62
TommyNecessary

Fragmentにバンドルを提供するにもかかわらず、nullとしてsavedInstanceStateを常に取得していたという同様の問題がありました。

私のために働いた唯一の解決策は

myFragment.setArguments(bundle) 

アクティビティからのバンドルで

Bundle bundle = this.getArguments();

フラグメントのonCreateViewで。

これが他の誰かに役立つことを願っています。

5
Arun Yogannadan

フラグメントの場合:-

use this for save state of fragment on orientation.

onCreate(Bundle save)
{
   super.onCreate(save);
   setRetainInstance(true);
}

このチュートリアルを参照してください:- http://techbandhu.wordpress.com/2013/07/02/Android-headless-fragment/

アクティビティの場合:-

onCreateでアプリケーションを起動すると、バンドルオブジェクトがnullになるため、以下のようなチェックを入れて、画面を回転させるとonSaveInstanceが呼び出され、バンドルオブジェクトが初期化されます

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    if (savedInstanceState != null) {
         boolean t = outState.getBoolean("restore"); 
         int s = outState.getInt("nAndroids");
    }
}
2
Rahul Gupta

最初にデータを入れてから、super.onSaveInstanceState(outState);を呼び出す必要があります

public void onSaveInstanceState(Bundle outState) {

    outState.putBoolean("restore", true);
    outState.putInt("nAndroids", 2);
    super.onSaveInstanceState(outState);
}

そして、アクティビティがAndroidManifest.xmlnohistoryプロパティを持たないようにするか、falseに設定してください。

        <activity
        Android:noHistory="false">
1

これは古い投稿であることはわかっていますが、ここや他の多くの場所で正しい答えを見つけることができなかったので、自分のケースを修正した方法を投稿しています。

したがって、私のフラグメントはアクティビティ内にあります。そして、私はもともとフラグメントのみでバンドルを保存し、onCreateViewで取得しようとしました。しかし、それは問題でした。

アクティビティでmyFragmentオブジェクトを開始することでこれを修正し、onSaveInstanceState()のアクティビティバンドルにそのオブジェクトを配置しました。次に、onRestoreInstanceState()で取得しました。 getSupportFragmentManager()。putFragment/getFragmentを使用しました。その後、フラグメント内のsavedInstanceStateはnullではなくなりました。

0
user3879095