我对Android生命周期非常了解。我在这里发帖是因为我观察到一种奇怪的行为,无论如何这是我自己的想法。
我的情况是这样的:一个活动将使用只有一个EditText
的简单布局。在活动onCreate
方法中,我将一些默认文本设置为EditText
,并在方法的后续部分中,将TextWatcher
分配给EditText
,以便每当用户输入任何内容时,我可以用自己的方式回应。
在旋转屏幕之前,一切都会好起来的。 TextWatcher
回调开始对初始化EditText
的代码做出反应。
根据正常的代码流程,TextWatcher
在初始化EditText
的文本值后稍后分配。所以它不应该因为onCreate
方法中的文本分配而触发。
这里有人可以解释一下吗?
答案 0 :(得分:8)
以下是您看到此行为的原因:
Bundle
savedInstanceState
参数为空。savedInstanceState
参数中的非空值。onCreate
返回,Android会调用onRestoreInstateState
。id
的所有视图都会尝试恢复其状态,EditText
也会恢复其状态(实际上,恢复其中大部分的TextView
)。onCreate
方法完成后),EditText
控件会自行调用setText
,以便恢复配置更改之前的文本。< / LI>
TextWatcher
方法中添加的新 onCreate
会收到有关此更改的通知。为了明确这一点,您在第一次调用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)
{
}
}