【问题标题】:Retain fragment data on screen rotation在屏幕旋转时保留片段数据
【发布时间】:2021-01-04 17:17:40
【问题描述】:

我有 3 个片段,其中 1 个片段对其他 2 个片段进行了更改。

问题是:当我旋转屏幕背景颜色和片段 2 和 3 的位置时恢复。 我想保留它们而不修改AndroidManifest.xml。 最好使用 onSaveInstanceState 或 setRetainInstance 还是同时使用?

我找到了一些关于保留片段的其他答案,但没有一个对我的案例有益。

第一个片段

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

SecondFragment

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

【问题讨论】:

    标签: android android-fragments android-activity android-fragmentactivity


    【解决方案1】:

    setRetainInstance() 已弃用。建议使用 ViewModel 在配置更改时保留数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多