独自の状態 (選択されたボタンなど) を持つフラグメントがあります。その状態は、画面の回転で失われます。
フラグメントを含むアクティビティには、/res/layout/ に縦向きのレイアウトがあり、/res/layout-land/ にはほぼ同じ横向きのレイアウトがあります。どちらのレイアウトにも、次のようなフラグメントが含まれています。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
android:id="@+id/testFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
class="au.com.x.y.TestFragment" />
...</LinearLayout>
私がテストしてきたフラグメントクラスは次のとおりです。
public class TestFragment extends android.support.v4.app.Fragment {
private static final String TAG = "TestFragment";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate(): " +
(savedInstanceState != null ? "NOT NULL" : "NULL"));
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(TAG, "onActivityCreated(): " +
(savedInstanceState != null ? "NOT NULL" : "NULL"));
}
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
Log.i(TAG, "onSaveInstanceState()");
state.putString("saved_thing", "some_value");
}
public View onCreateView(
LayoutInflater inflater,
ViewGroup container,
Bundle b) { ... }
}
ActionBarSherlock を介して導入されたフラグメント用の 3.0 より前のサポート パッケージを使用していることに注意してください。
LogCat は私に与えます:
BEFORE SCREEN ROTATION (PORTRAIT):
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL
02-23 11:45:58.015: I/TestFragment(22629): onCreateView()
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL
AFTER SCREEN ROTATION (LANDSCAPE):
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL
02-23 11:46:00.615: I/TestFragment(22629): onCreateView()
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL
ご覧のとおり、は呼び出されず、フラグメントは と の両方で常にonSaveInstanceState()
null を取得します。savedInstanceState
onCreate()
onActivityCreated()
私はmyFragment.setRetainInstance(true)
自分の活動を試しましonCreate()
たが、何も変わっていません。
私onSaveInstanceState()
には @Override があるので、タイプミスのようなばかげたものではないことはわかっています。
ActionBarSherlock の例 (com.actionbarsherlock.sample.shakespeare) の 1 つを見てきましたが、そこにあるフラグメントのonSaveInstanceState()
メソッドが適切に呼び出されています。私が知る限り、その例は私のコードとまったく同じように書かれています — フラグメントはレイアウトとレイアウトランド XML の両方に含まれています。メイン プロジェクトで使用しているのとまったく同じバージョンの ActionBarSherlock を使用してそのサンプルをビルドしたこともあり、インスタンスの状態の保存はその例では正常に機能します。
画面を回転させてもフラグメントの状態を維持するにはどうすればよいですか? なぜonSaveInstanceState()
呼び出されないのですか?