正如标题所暗示的那样,如何避免方向更改后TextView
丢失其文本?
注意TextView
是如何绑定到Switch
的:初始文本(在XML中定义)是OFF(因为Switch
最初处于关闭状态),并且在每次Switch
状态更改时,TextView
的文本都会相应地更改。
预期行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 打开
Switch
:TextView
已打开 - 旋转设备:
Switch
保持打开状态,TextView
保持打开
状态
实际行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 打开
Switch
:TextView
已打开 - 旋转设备:
Switch
保持打开状态,但TextView
处于关闭
状态
发生以下情况是因为重绘了Fragment
,并且由于每次方向更改时都会调用OnCheckedChangeListener
(我的问题:SwitchCompat OnCheckedChangeListener 在 Fragment 的每个方向更改时调用),但处理仅在实际按下Switch
时才发生(为了避免上述问题中的问题),因此TextView
是使用 XML 中的默认文本绘制的。
没有 isPressed() 的行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 打开
Switch
:TextView
已打开 - 旋转设备:
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 元素。您需要在方向更改时保存和恢复片段实例。有关如何操作,请参阅此答案。