屏幕旋转后保持TextView可见性(View.INVISIBLE)和Button状态(setEnabled(false))

时间:2018-08-17 23:12:31

标签: android layout activity-lifecycle

我有一个带有按钮的应用程序,用于显示所问问题的答案。还有一个带有警告文本的TextView和另一个空的文本视图,当单击按钮时将显示答案。当用户单击按钮时,我希望警告textView消失并且按钮“不可点击”。我设法实现了这一目标,并且一切都按预期工作,但是当我旋转屏幕时出现了问题,没有任何变化。 下面的代码在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;
    });

4 个答案:

答案 0 :(得分:0)

屏幕旋转时会触发Oncreate()回调,请在Androidmanifest.xml中添加以下行以防止重新创建活动。

android:configChanges="keyboardHidden|orientation|screenSize

详细的移出物是here

答案 1 :(得分:0)

这很简单。您可以使用navylover或执行以下操作 1)打开清单文件 2)将android:configChages="keyboardHidden|orientation|screenSize"添加到您的活动中,例如

<activity android:name=".MainActivity"
android:configChanges = "keyboard|orientation|screenSize"

//,并保留活动的其余代码。只需添加此行,您就可以开始使用

旋转屏幕时会发生什么?实际上,您的活动配置发生了变化,您可能会说您的活动再次创建为新活动。旋转屏幕时,它实际上会破坏您的活动并重新创建它,并且所有内容都会重置。 但这不是使用此行代码的最佳选择。您可以使用viewModal。它可以保存您的活动状态,并且当您的活动被破坏并重新创建时,与该活动链接的同一个viewModal可以帮助保存配置和保存状态

希望这对您有帮助

答案 2 :(得分:0)

旋转屏幕时,应使用onSaveInstanceState保存局部变量的状态,然后使用onCreate中保存的值(在旋转时调用此值以创建新的旋转活动)。

因此添加此功能

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

答案 3 :(得分:0)

我的答案与泰勒(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);
    }
}