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

dar*_*kok 6 lifecycle android android-activity

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

我的情况是这样的:一个活动将只使用一个简单的布局EditText.在活动onCreate的方法,我设置一些默认的文本到EditText,并在方法的后面部分,分配TextWatcherEditText任何东西所以每当用户类型,我可以回应我自己的方式.

在我旋转屏幕之前一切都还好.该TextWatcher回调开始针对初始化代码反应EditText.

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

这里有人能解释一下吗?

ina*_*ruk 8

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

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

为了清楚说明,您在第一次调用时添加的 TextWatcher onCreate不会被保留!它的 TextWatcher,在最后一次调用时添加onCreate,它接收文本更改通知.

您可以自己检查TextView.onRestoreInstanceState.


Kak*_*key 1

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

android:configChanges="orientation|keyboardHidden"
Run Code Online (Sandbox Code Playgroud)

并且在你的活动中

public void onConfigurationChanged(Configuration newConfig)
{       
    super.onConfigurationChanged(newConfig);    

    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)
    {

    }      
    else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)
    {

    }  
}
Run Code Online (Sandbox Code Playgroud)