SOで同様の質問の多くの事例を見つけましたが、残念ながら私の要件を満たす回答はありません。
縦向きと横向きのレイアウトが異なり、バックスタックを使用しています。これにより、setRetainState()
構成変更ルーチンを使用できなくなり、トリックを使用できなくなります。
デフォルトのハンドラーに保存されない特定の情報をTextViewでユーザーに表示します。アクティビティのみを使用してアプリケーションを作成する場合、以下がうまく機能しました。
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Fragment
これが唯一の非常に特定の状況で動作します。具体的には、ひどく壊れるのは、フラグメントを置き換え、それをバックスタックに入れ、新しいフラグメントが表示されている間に画面を回転させることです。私が理解したところによると、古いフラグメントはonSaveInstanceState()
置き換えられたときにへの呼び出しを受信しませんが、何らかの形でにリンクされたままでありActivity
、このメソッドは、それView
が存在しないときに後で呼び出されるため、私TextView
の結果をに探しNullPointerException
ます
また、sを使用しても問題TextViews
がなかったFragment
としても、s を使用した参照を維持することは良い考えではありませんActivity
。その場合、onSaveInstanceState()
実際には状態が保存されますが、フラグメントが非表示のときに画面を2度回転するonCreateView()
と、新しいインスタンスで呼び出されないため、問題が再発します。
状態onDestroyView()
をいくつかのBundle
タイプのクラスメンバー要素(実際には1つだけではなく、より多くのデータですTextView
)に保存し、onSaveInstanceState()
それを保存することを考えましたが、他にも欠点があります。主に、フラグメントが現在表示されている場合、2つの関数を呼び出す順序が逆になるため、2つの異なる状況を考慮する必要があります。よりクリーンで正しい解決策が必要です!