我如何正确处理 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
的文本也会相应更改。
预期行为:
- 打开应用:
Switch
关闭,TextView
关闭
- 开启
Switch
:TextView
是开启
- 旋转设备:
Switch
保持开启并且TextView
保持开启
实际行为:
- 打开应用:
Switch
关闭,TextView
关闭
- 开启
Switch
:TextView
是开启
- 旋转设备:
Switch
保持开启,但TextView
关闭
发生以下情况是因为 Fragment
被重绘并且每次方向更改时都会调用 OnCheckedChangeListener
(我的问题:),但处理仅在 Switch
实际上被按下了(为了避免上面问题中的问题),TextView
是用 XML 中的默认文本绘制的。
没有 isPressed() 的行为:
- 打开应用:
Switch
关闭,TextView
关闭
- 开启
Switch
:TextView
是开启
- 旋转设备:
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 如何操作。
如标题所示,如何避免 TextView
在方向改变后丢失其文本?
注意 TextView
是如何绑定到 Switch
的:初始文本(在 XML 中定义)是 OFF(因为 Switch
最初处于关闭状态),并且在每次 Switch
状态更改时,TextView
的文本也会相应更改。
预期行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 开启
Switch
:TextView
是开启 - 旋转设备:
Switch
保持开启并且TextView
保持开启
实际行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 开启
Switch
:TextView
是开启 - 旋转设备:
Switch
保持开启,但TextView
关闭
发生以下情况是因为 Fragment
被重绘并且每次方向更改时都会调用 OnCheckedChangeListener
(我的问题:Switch
实际上被按下了(为了避免上面问题中的问题),TextView
是用 XML 中的默认文本绘制的。
没有 isPressed() 的行为:
- 打开应用:
Switch
关闭,TextView
关闭 - 开启
Switch
:TextView
是开启 - 旋转设备:
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 如何操作。