【问题标题】:Keeping TextView visibility (View.INVISIBLE) and Button state (setEnabled(false)) after screen rotation屏幕旋转后保持 TextView 可见性 (View.INVISIBLE) 和按钮状态 (setEnabled(false))
【发布时间】:2018-08-17 23:12:30
【问题描述】:

我有一个带有按钮的应用程序来显示所问问题的答案。还有一个带有警告文本的 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;
    });

【问题讨论】:

    标签: android layout activity-lifecycle


    【解决方案1】:

    这很简单。您可以使用 navylover 或执行以下操作

    1. 打开清单文件

    2. android:configChanges="keyboardHidden|orientation|screenSize" 添加到您的活动中,例如

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      您应该在屏幕旋转时使用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);
          }
      }
      

      【讨论】:

      • 很高兴听到这个消息!如果它回答了您的问题,请接受答案。
      • 对不起,我是 stackoverflow 的新手,我对接受答案一无所知。然而,我现在做到了。再次感谢您。
      【解决方案3】:

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

      android:configChanges="keyboardHidden|orientation|screenSize
      

      详细解释是here

      【讨论】:

      • 这有点肮脏的解决方法 - 当活动进入后台并重新创建时,视图状态仍然会丢失。正确的方法是使用savedInstanceState
      • @Pawel 我同意你的观点,解决这个问题的关键是了解活动的生命周期。
      【解决方案4】:

      我的回答与上面的 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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-12
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        相关资源
        最近更新 更多