Android在配置更改后保留回调状态

时间:2011-05-17 08:32:30

标签: android android-activity lifecycle

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

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

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

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

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

2 个答案:

答案 0 :(得分:8)

以下是您看到此行为的原因:

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

  7. 为了明确这一点,您在第一次调用onCreate时添加的 TextWatcher不会被保留!它的 new TextWatcher,是在最后一次调用onCreate时添加的,它接收文本更改通知。

    您可以自己检查TextView.onRestoreInstanceState

答案 1 :(得分:1)

当您旋转设备时,再次调用onCreate活动方法。如果要阻止在旋转设备时调用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)
    {

    }  
}