13

独自の状態 (選択されたボタンなど) を持つフラグメントがあります。その状態は、画面の回転で失われます。

フラグメントを含むアクティビティには、/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 を取得します。savedInstanceStateonCreate()onActivityCreated()

私はmyFragment.setRetainInstance(true)自分の活動を試しましonCreate()たが、何も変わっていません。

onSaveInstanceState()には @Override があるので、タイプミスのようなばかげたものではないことはわかっています。

ActionBarSherlock の例 (com.actionbarsherlock.sample.shakespeare) の 1 つを見てきましたが、そこにあるフラグメントのonSaveInstanceState()メソッドが適切に呼び出されています。私が知る限り、その例は私のコードとまったく同じように書かれています — フラグメントはレイアウトとレイアウトランド XML の両方に含まれています。メイン プロジェクトで使用しているのとまったく同じバージョンの ActionBarSherlock を使用してそのサンプルをビルドしたこともあり、インスタンスの状態の保存はその例では正常に機能します。

画面を回転させてもフラグメントの状態を維持するにはどうすればよいですか? なぜonSaveInstanceState()呼び出されないのですか?

4

2 に答える 2

23

状態の保持を有効myFragment.setRetainInstance(true)にできますが、これは「自動的に」行われます。つまり、クラス メンバーに割り当てられた値が保持され、onSaveInstanceState は使用されません (したがって、savedInstanceState は常に null です)。

FragmentActivityこのフラグメントをホストする がオーバーライドしないことを確認するか、オーバーライドonSaveInstanceStateするときに を呼び出す必要がありますsuper.onSaveInstanceState(Bundle)

于 2012-02-23T16:10:39.073 に答える
-1

フラグメントが回転時に別のレイアウト リソースを必要とする場合は、setRetainInstance(true)使用できません。このページでは、フラグメントのライフサイクルをsetRetainInstance(true).

オリジナルのアイデアはonSaveInstanceState()、通常のアクティビティと同様に、すべてのメンバー データを保持するために使用されます。しかし、なぜかonSaveInstanceState()呼び出されない。しかしFragmentActivity、@Eric Kokが示唆したように正しいです)。私が見つけた最善の解決策は、Arguments of Fragment を使用することです。

Fyodor Volchyokによる解決策を参照してください。簡単です。onSaveInstanceState() および onViewCreated() であるかのように動作します。outStatesavedInstanceState

于 2014-11-22T07:22:10.927 に答える