Activity再構築時にFragment状態を保つ方法
1658 ワード
仮定シーン
Fragment法で中央のEditTextを実現し、EditTextにいくつかの内容を入力し、画面が回転した後、EditTextに入力した内容が空にならないようにする.
1、Fragmentを繰り返し作成しない
Activityが破棄されるたびに現在のfragment状態が自動的に保存されるので、以下の方法で判断しないと、activity再構築のたびにfragmentが繰り返し生成されます.
FragmentManager fm= getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.second_fragment_container);
if ( fragment == null ) {
fragment = new SecondFragment();
fm.beginTransaction().add(R.id.second_fragment_container, fragment).commit();
}
2,setRetainInstanceメソッドを使用する
このメソッドをtrueに設定すると、fragmentはactivityが再構築されたときにインスタンスを一定に保つことができます.
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
このメソッドを設定すると、activityの再構築時のfragmentライフサイクルとactivityライフサイクルにいくつかの差が生じます.違いは次のとおりです.
3、Viewをグローバル変数として保存
なぜsetReatainInstanceメソッドが設定されているのか、画面を回転させるとEditTextに入力された内容もクリアされるのか、という発見があります.これはFragmentのonCreateViewメソッドが再実行され、新しいViewが再作成されたため、自然と以前に入力した内容はなくなりました.次のようにグローバルビューを設定できます.
View view = null;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if ( view == null ) {
Log.e("TestFragment", "view == null");
view = inflater.inflate(R.layout.fragment_second, container, false);
}
return view;
}