Сохранение фрагментных данных при повороте экрана

#android #android-fragments #android-activity #android-fragmentactivity

#Android #android-фрагменты #android-активность #android-fragmentactivity

Вопрос:

У меня есть 3 фрагмента, где 1 фрагмент вносит изменения в другие 2.

Проблема в том, что при повороте цвет фона экрана и места фрагментов 2 и 3 восстанавливаются. Я хочу сохранить их без изменения AndroidManifest.xml . Лучше ли использовать onSaveInstanceState или setRetainInstance или оба?

Я нашел несколько других ответов о сохранении фрагментов, но ни один из них не был полезен для моего случая.

FirstFragment

 public class FirstFragment extends Fragment 
{
    private OnFragmentInteractionListener mListener;
    private ChangeColorListener mCallBack;
    private boolean clickCheck = false;

    public FirstFragment() { }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_first, container, false);

        Button buttonOk = v.findViewById(R.id.button_ok);
        Button btn = v.findViewById(R.id.button_replace);
        buttonOk.setOnClickListener(v1 -> mCallBack.changeColor(R.color.black));
        btn.setOnClickListener(v12 -> {
            clickCheck = !clickCheck;
            mListener.changeFragment(clickCheck);
        });

        return v;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        if (savedInstanceState!=null) {
            mCallBack =(MainActivity)getActivity();
            mListener = (MainActivity)getActivity();
        }
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        if (context instanceof ChangeColorListener) {
            mCallBack = (ChangeColorListener) context;
        } else {
            throw new RuntimeException(context.toString()
                      " must implement ChangeColorListener");
        }

        try {
            mListener = (OnFragmentInteractionListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                      " must implement OnFragmentInteractionListener");
        }
    }


    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}
 

Второй фрагмент

 public class SecondFragment extends Fragment 
{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_second, container, false);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
    public void change(int color){
        getView().setBackgroundColor(color);
    }
}
 

Третий фрагмент

 public class ThirdFragment extends Fragment {


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_third, container, false);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);

    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    public void change(int color){
        getView().setBackgroundColor(color);
    }
}
 

Ответ №1:

setRetainInstance() не рекомендуется. ViewModel рекомендуется для сохранения данных при изменении конфигурации.