【问题标题】:Android retain callback state after configuration changeAndroid 在配置更改后保留回调状态
【发布时间】:2011-05-17 08:32:30
【问题描述】:

我非常了解 Android 生命周期。我在这里发帖是因为我观察到一种奇怪的行为,无论如何这是我自己的想法。

我的情况是这样的:一个活动将使用一个简单的布局,只有一个EditText。在活动onCreate 方法中,我为EditText 设置了一些默认文本,在该方法的后面部分,将TextWatcher 分配给EditText,因此每当用户输入任何内容时,我都可以以自己的方式响应.

在我旋转屏幕之前一切都很好。 TextWatcher 回调开始对初始化 EditText 的代码做出反应。

按照正常的代码流程,TextWatcher是在初始化EditText的文本值后赋值的。所以它不应该因为 onCreate 方法中的文本分配而触发。

这里有人可以解释一下吗?

【问题讨论】:

    标签: android android-activity lifecycle


    【解决方案1】:

    这就是您看到这种行为的原因:

    1. 第一次调用“onCreate”方法时,它没有保存状态。这意味着Bundle savedInstanceState 参数为空。
    2. 配置更改时,Android 路径 savedInstanceState 参数中的非空值。
    3. 配置更改后,onCreate 返回,Android 调用onRestoreInstateState
    4. 默认情况下,所有具有id 的视图都在尝试恢复其状态,EditText 也会恢复其状态(实际上,TextView 恢复了大部分状态)。
    5. 在状态恢复期间的某个地方(但在 onCreate 方法完成之后),您的 EditText 控件对自己调用 setText 以恢复它在配置更改之前的文本。
    6. 您在onCreate 方法中添加的 TextWatcher 会收到有关此更改的通知。

    为了清楚起见,您在第一次调用 onCreate 时添加的 TextWatcher 不会被保留!它的 TextWatcher,在上次调用onCreate 时添加,它接收文本更改通知。

    您可以自己检查TextView.onRestoreInstanceState

    【讨论】:

      【解决方案2】:

      当您旋转设备时,活动的 onCreate 方法会再次调用。如果您想防止在旋转设备时调用 onCreate,请在 Manifest 中执行以下代码

      android:configChanges="orientation|keyboardHidden"
      

      在你的活动中

      public void onConfigurationChanged(Configuration newConfig)
      {       
          super.onConfigurationChanged(newConfig);    
      
          if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
          {
      
          }      
          else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)
          {
      
          }  
      }
      

      【讨论】:

      • 使用 android:ConfigChanges 就足够了,如果你想做一些特定的事情,你只需要你的活动代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多