我如何正确处理 TextView 绑定到 Switch on orientation change, in fragment

Ho do I properly handle TextView bound to Switch on orientation change, in fragment

如标题所示,如何避免 TextView 在方向改变后丢失其文本?
注意 TextView 是如何绑定到 Switch 的:初始文本(在 XML 中定义)是 OFF(因为 Switch最初处于关闭状态),并且在每次 Switch 状态更改时,TextView 的文本也会相应更改。

预期行为:

  1. 打开应用:Switch关闭,TextView关闭
  2. 开启SwitchTextView开启
  3. 旋转设备:Switch保持开启并且TextView保持开启

实际行为:

  1. 打开应用:Switch关闭,TextView关闭
  2. 开启SwitchTextView开启
  3. 旋转设备:Switch保持开启,但TextView关闭

发生以下情况是因为 Fragment 被重绘并且每次方向更改时都会调用 OnCheckedChangeListener(我的问题:),但处理仅在 Switch 实际上被按下了(为了避免上面问题中的问题),TextView 是用 XML 中的默认文本绘制的。

没有 isPressed() 的行为:

  1. 打开应用:Switch关闭,TextView关闭
  2. 开启SwitchTextView开启
  3. 旋转设备:Switch "stays" 打开 TextView "stays" 打开 但是 再次调用 OnCheckedChangeListener,我想避免这种情况,因为如果用户实际切换 Switch[,我想在那里调用 ONLY =86=]

MainFragment.java:

public class MainFragment extends Fragment implements CompoundButton.OnCheckedChangeListener {

    private AppCompatTextView appCompatTextView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.main_fragment, container, false);
        appCompatTextView = rootView.findViewById(R.id.app_compat_textview);
        final SwitchMaterial switchMaterial = rootView.findViewById(R.id.switch_material);
        switchMaterial.setOnCheckedChangeListener(this);
        return rootView;
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (buttonView.isPressed()) {
            if (isChecked) {
                appCompatTextView.setText("ON");
            } else {
                appCompatTextView.setText("OFF");
            }
        }
    }
}

片段在每次方向改变时都会被破坏。因此所有 UI 元素都被重绘。您需要的是在方向更改时保存和恢复片段实例。参考 this answer 如何操作。