屏幕旋转后保持 TextView 可见性 (View.INVISIBLE) 和 Button 状态 (setEnabled(false))
Keeping TextView visibility (View.INVISIBLE) and Button state (setEnabled(false)) after screen rotation
我有一个带有按钮的应用程序来显示所问问题的答案。还有一个带有警告文本的 TextView 和另一个空的文本视图,它在单击按钮时显示答案。当用户单击按钮时,我希望警告 textView 消失,按钮变为 "unclickable"。我设法实现了这一点并且一切都按预期工作,但是当我旋转屏幕时出现问题,没有任何东西保持不变。
下面的代码在 onCreate().
Button buShowAnswer = findViewById(R.id.buShowAnswer);
TextView tvShownAnswer = findViewById(R.id.tvShownAnswer);
TextView tvWarning = findViewById(R.id.tvWarning);
buShowAnswer.setOnClickListener((View v) -> {
String answer;
if (isAnswerTrue){
answer = getString(R.string.true_answer);
}else {
answer = getString(R.string.false_answer);
}
tvWarning.setVisibility(View.INVISIBLE);
buShowAnswer.setEnabled(false);
tvShownAnswer.setText(answer);
cheatState = true;
});
屏幕旋转时会触发 Oncreate() 回调,在 Androidmanifest.xml 中添加以下行以防止重新创建 activity.
android:configChanges="keyboardHidden|orientation|screenSize
详细解释是here
很简单。您可以选择 navylover 或执行以下操作
打开清单文件
将 android:configChanges="keyboardHidden|orientation|screenSize"
添加到你的 activity 赞
旋转屏幕时会发生什么?实际上你的 activity 配置发生了变化,你可能会说你的 activity 又被创建为新的了。当您旋转屏幕时,它实际上会破坏您的 activity 并重新创建它,然后一切都会重置。
但这不是使用这行代码的最佳选择。你可以使用viewModal。它保存你的活动状态,当你的 activity 被销毁并重新创建时,相同的 viewModal 与 activity 链接,这有助于保存配置和保存状态
希望这对您有所帮助
您应该使用 onSaveInstanceState
在屏幕旋转时保存局部变量的状态,然后在 onCreate
中使用保存的值(在旋转时调用它来创建新的旋转 activity).
所以添加这个功能
private boolean cheatState = false;
private static final String CHEAT_STATE = "CHEAT_STATE";
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(CHEAT_STATE, cheatState);
// call superclass to save any view hierarchy
super.onSaveInstanceState(outState);
}
然后在您的 onCreate
中您可以调用
if (savedInstanceState != null) {
cheatState = savedInstanceState.getBoolean(CHEAT_STATE);
if( cheatState ) {
buShowAnswer.setEnabled(false);
tvWarning.setVisibility(View.INVISIBLE);
}
}
我的回答与上面 Tyler 的类似,但它保存和恢复了可见性和启用状态。
private boolean isAnswerEnabled;
private int warningTextVisibility;
private static final String STATE_ANSWER = "state_cheat";
private static final String STATE_WARNING_VISIBILITY = "state_warning_visibility"
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_ANSWER, isAnswerEnabled);
oustState.putInt(STATE_WARNING_VISIBILITY, warningTextVisibility);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
isAnswerEnabled = savedInstanceState.getBoolean(STATE_ANSWER);
buShowAnswer.setEnabled(isAnswerEnabled);
warningTextVisibility = savedInstanceState.getInt(STATE_WARNING_VISIBILITY);
tvWarning.setVisibility(warningTextVisibility);
}
}
我有一个带有按钮的应用程序来显示所问问题的答案。还有一个带有警告文本的 TextView 和另一个空的文本视图,它在单击按钮时显示答案。当用户单击按钮时,我希望警告 textView 消失,按钮变为 "unclickable"。我设法实现了这一点并且一切都按预期工作,但是当我旋转屏幕时出现问题,没有任何东西保持不变。 下面的代码在 onCreate().
Button buShowAnswer = findViewById(R.id.buShowAnswer);
TextView tvShownAnswer = findViewById(R.id.tvShownAnswer);
TextView tvWarning = findViewById(R.id.tvWarning);
buShowAnswer.setOnClickListener((View v) -> {
String answer;
if (isAnswerTrue){
answer = getString(R.string.true_answer);
}else {
answer = getString(R.string.false_answer);
}
tvWarning.setVisibility(View.INVISIBLE);
buShowAnswer.setEnabled(false);
tvShownAnswer.setText(answer);
cheatState = true;
});
屏幕旋转时会触发 Oncreate() 回调,在 Androidmanifest.xml 中添加以下行以防止重新创建 activity.
android:configChanges="keyboardHidden|orientation|screenSize
详细解释是here
很简单。您可以选择 navylover 或执行以下操作
打开清单文件
将
android:configChanges="keyboardHidden|orientation|screenSize"
添加到你的 activity 赞
旋转屏幕时会发生什么?实际上你的 activity 配置发生了变化,你可能会说你的 activity 又被创建为新的了。当您旋转屏幕时,它实际上会破坏您的 activity 并重新创建它,然后一切都会重置。 但这不是使用这行代码的最佳选择。你可以使用viewModal。它保存你的活动状态,当你的 activity 被销毁并重新创建时,相同的 viewModal 与 activity 链接,这有助于保存配置和保存状态
希望这对您有所帮助
您应该使用 onSaveInstanceState
在屏幕旋转时保存局部变量的状态,然后在 onCreate
中使用保存的值(在旋转时调用它来创建新的旋转 activity).
所以添加这个功能
private boolean cheatState = false;
private static final String CHEAT_STATE = "CHEAT_STATE";
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(CHEAT_STATE, cheatState);
// call superclass to save any view hierarchy
super.onSaveInstanceState(outState);
}
然后在您的 onCreate
中您可以调用
if (savedInstanceState != null) {
cheatState = savedInstanceState.getBoolean(CHEAT_STATE);
if( cheatState ) {
buShowAnswer.setEnabled(false);
tvWarning.setVisibility(View.INVISIBLE);
}
}
我的回答与上面 Tyler 的类似,但它保存和恢复了可见性和启用状态。
private boolean isAnswerEnabled;
private int warningTextVisibility;
private static final String STATE_ANSWER = "state_cheat";
private static final String STATE_WARNING_VISIBILITY = "state_warning_visibility"
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_ANSWER, isAnswerEnabled);
oustState.putInt(STATE_WARNING_VISIBILITY, warningTextVisibility);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
isAnswerEnabled = savedInstanceState.getBoolean(STATE_ANSWER);
buShowAnswer.setEnabled(isAnswerEnabled);
warningTextVisibility = savedInstanceState.getInt(STATE_WARNING_VISIBILITY);
tvWarning.setVisibility(warningTextVisibility);
}
}