web-dev-qa-db-ja.com

画面の回転後にonSaveInstanceStateが呼び出されない

OnSaveInstanceStateに関して多くの質問があることは知っていますが、問題に対する答えを見つけることができませんでした。

AppCompatActivityを拡張するアクティビティがあります。このアクティビティは3つのフラグメントを使用し、表示されているフラグメントを追跡するための変数 'intcurrentStep'があります。 onSavedInstanceStateメソッドでcurrentStep変数をバンドルに格納し、次にonCreateメソッドでそれを復元します。

public class MainActivity extends AppCompatActivity {
    private final String CURRENT_STEP_TAG = "current_step";
    private int currentStep;

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

        if(savedInstanceState == null) {
            loadFirstFragment();
        } else {            
            currentStep = savedInstanceState.getInt(CURRENT_STEP_TAG);
            if(currentStep == 2){
                //Do some stuff...
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        Log.d("deubg", "--------onsaveinstancestate--------");
        outState.putInt(CURRENT_STEP_TAG, currentStep);
        super.onSaveInstanceState(outState, outPersistentState);
    }

 ...

}

重要なのは、画面の向きが変わってもonSavedInstanceStateが呼び出されないということです。グーグルのドキュメントによると、呼び出されるはずです。 「-------- onsaveinstancestate --------」というメッセージはコンソールに表示されません。ただし、onCreateメソッドのBundle savedInstanceStateは、画面の回転後にnull以外になりますが、int'currentStep 'がありません。

私は多くのことを試しました。ActionBarActivityのAppCompatActivityを変更し、super.onSavedInstanceStateの呼び出しを別の場所に移動し、他の変数を格納しようとしました。しかし、私が何をしても、メソッドは実行されません。

また、マニフェストにAndroid:configChangesがありません。

私のアプリケーションはsdkバージョン22、buildToolsVersion22.0.1に対してコンパイルされています

26
VorteXavier

アプリがLollipop(API21)バージョンのAndroid以降)でrunningでない限り、

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);

21より前のバージョンのプラットフォームには存在しないため、[〜#〜] not [〜#〜]は呼び出されます。preをサポートするには上記の代わりに、次のメソッドをオーバーライドする必要があるAPI21デバイス:

public void onSaveInstanceState (Bundle outState);

これはAPI21以降でも機能するため、もちろん、両方のメソッドをオーバーライドする必要はありません(新しいメソッドが提供するPersistableBundleを処理する必要があることがわかっている場合を除く)。

ドキュメントを参照

69
Marcin Orlowski