更改设备方向时,更改onCreate()内的EditText的值无效

时间:2012-05-08 03:40:39

标签: java android mobile android-activity

我的理解是,当您更改设备方向时,您的应用会被销毁并再次创建。这意味着每次旋转设备时都应运行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,但给出的答案并没有真正解释为什么会发生这种行为。

3 个答案:

答案 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()。