我是否正确处理绑定到在片段中切换方向更改的文本视图



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

预期行为:

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

实际行为:

  1. 打开应用:Switch关闭,TextView关闭
  2. 打开SwitchTextView打开
  3. 旋转设备:Switch保持打开状态,但TextView处于关闭
  4. 状态

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

没有 isPressed() 的行为:

  1. 打开应用:Switch关闭,TextView关闭
  2. 打开SwitchTextView已打开
  3. 旋转设备:Switch"保持"打开状态,TextView"保持">打开状态,再次调用OnCheckedChangeListener,我想避免这种情况,因为只有当用户实际切换Switch时,我才希望在那里拨打电话

主片段.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 元素。您需要在方向更改时保存和恢复片段实例。有关如何操作,请参阅此答案。

最新更新