我的理解是,当您更改设备方向时,您的应用会被销毁并再次创建。这意味着每次旋转设备时都应运行onCreate()。
我每次创建应用程序时都会尝试设置EditText,包括每次旋转屏幕时。所以,我启动应用程序,文本字段显示“Bap”。然后我将字段的内容更改为“Boop”,然后旋转屏幕。我希望该领域现在说“Bap”,但事实并非如此,在改变方向之前,它仍然是我改变后的状态。这是为什么?
我的onCreate()看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText editText = (EditText)findViewById(R.id.edit_message);
editText.setText("Bap", TextView.BufferType.EDITABLE);
}
值得注意的是,如果我将setText()调用移动到onResume(),一切都按照我的预期进行,每次旋转设备时文本字段都会重置。
注意:我意识到a similar question has been asked,但给出的答案并没有真正解释为什么会发生这种行为。
答案 0 :(得分:2)
这种情况正在发生,因为Android框架正在做它应该做的事情。它正在保存一个包(SavedInstanceState),其中包含有关应用当前状态的所有信息,以便在方向更改后重新创建视图时使用。
您是否在发布的onCreate中留下了一些代码?也许是这样的:
if (savedInstanceState == null)
如果您的onCreate代码包含在if中,那就是您没有看到预期结果的原因。
标准做法是让onCreate看起来像这样:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (savedInstanceState == null) {
// Your first time start-up code here, will not run on orientation change
}
// Any code you want to run EVERY time onCreate runs goes here
}
这样做是为了让您不必在方向更改上不必要地重新创建所有内容。
希望这有帮助!
修改强>
进一步研究,看起来发生了什么(从here收集):
设备方向更改
onSaveInstanceState(Bundle outState)
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState(Bundle inState)
onResume()
它基本上是说捆绑包已经传递给onRestoreInstanceState
,这发生在onCreate
之后,这可以解释你的情况发生了什么。
因此,解决方案是将EditText值的设置移至onResume
方法(或覆盖onRestoreInstanceState
)。
答案 1 :(得分:1)
我决定深入研究传递到savedInstanceState
方法的onCreate
,我发现了这个:
键:android:viewHierarchyState
价值:Bundle
该捆绑包具有此键值对:
键:android:views
价值:SparseArray
SparseArray
具有此值:TextView.SavedState{41857898 start=4 end=4 text=Boop}
所以正在发生的事情是Android会自动恢复某些View
的状态,可能是onRestoreInstanceState
方法。
要防止此行为,请在XML中将此行添加到EditText
:
android:saveEnabled="false"
要以编程方式执行此操作,请致电view.setSaveEnabled(false)
。
答案 2 :(得分:0)
是。重新创建活动时,无法在onCreate中为edittext设置任何值。 你应该改变onResume()。