SOで同様の質問の例をたくさん見つけましたが、残念ながら私の要件を満たす答えはありません。
ポートレートとランドスケープのレイアウトが異なり、バックスタックを使用しています。これにより、setRetainState()
構成変更ルーチンを使用できなくなり、トリックを使用できなくなります。
TextViewsでユーザーに特定の情報を表示しますが、デフォルトのハンドラーには保存されません。アクティビティのみを使用してアプリケーションを作成する場合、次のことがうまく機能しました。
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));
}
sを使用Fragment
すると、これは非常に特定の状況でのみ機能します。具体的には、ひどく壊れているのは、フラグメントを置き換え、それをバックスタックに配置し、新しいフラグメントが表示されている間に画面を回転させることです。私が理解したところによると、古いフラグメントはonSaveInstanceState()
置き換えられたときにへの呼び出しを受け取りませんが、何らかの形でにリンクされたままでActivity
あり、このメソッドは後でView
存在しなくなったときに呼び出されるため、私TextView
の結果のいずれかを検索するとになりNullPointerException
ます。
また、 'sで問題がなかったとしても、sで自分への参照を保持するのTextViews
は良い考えではないことがわかりました。その場合、実際には状態が保存されますが、フラグメントが非表示になっているときに画面を2回回転すると、新しいインスタンスでは呼び出されないため、問題が再発します。Fragment
Activity
onSaveInstanceState()
onCreateView()
状態onDestroyView()
をいくつかのBundle
型クラスのメンバー要素(実際には1つだけではなく、より多くのデータTextView
)に保存して保存することを考えましonSaveInstanceState()
たが、他にも欠点があります。主に、フラグメントが現在表示されている場合、2つの関数を呼び出す順序が逆になるため、2つの異なる状況を考慮する必要があります。よりクリーンで正しい解決策が必要です!