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ライフサイクルにいくつかの差が生じます.違いは次のとおりです.
  • onDestroyは呼び出されません(ただし、fragmentは現在のactivityから先に分離されるため、onDetachメソッドは呼び出されません)
  • .
  • onCreateはfragmentが再作成されていないため、
  • は呼び出されません.
  • onAttachおよびonActivity Createdも呼び出されます.

    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;
    }