2011-05-17 56 views
6

我对Android生命周期很了解。我在这里发帖是因为我观察到一个奇怪的行为,无论如何这是我自己的想法。Android在配置更改后保留回调状态

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

一切都好,直到我旋转屏幕。 TextWatcher回调开始对初始化EditText的代码作出反应。

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

这里有人可以解释吗?

回答

1

当你永远旋转的装置称为活动的onCreate方法again.if要防止旋转设备时要调用的onCreate做的清单

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) 
    { 

    } 
} 
+0

与android:ConfigChanges就够了,你只需要你的代码活动,如果你想做某些特定的事情 – yeradis 2011-05-17 09:24:08

7

这就是为什么你看到此行为:

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

只是为了明确这一点,你 TextWatcher,你加在第一次调用onCreate,不保留!它的新的 TextWatcher,在上次调用onCreate时添加的,它接收文本更改通知。您可以自行检查TextView.onRestoreInstanceState