屏幕旋转后保持 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 或执行以下操作

  1. 打开清单文件

  2. 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);
    }
}