1

我的理解是,当您更改设备方向时,您的应用程序会被销毁并再次创建。这意味着 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() 中,一切都会按我的预期工作,每次旋转设备时都会重置文本字段。

注意:我意识到已经提出了类似的问题,但给出的答案并不能真正解释为什么会发生这种行为。

4

3 回答 3

3

它正在发生,因为 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
}

这样做是为了避免在方向更改时不必要地重新创建所有内容。

希望这可以帮助!

编辑

进一步研究它,看起来正在发生的事情是这样的(从这里收集):

设备方向改变

onSaveInstanceState(Bundle outState)
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState(Bundle inState)
onResume()

基本上是说捆绑包正在传递给onRestoreInstanceState,它发生在 之后onCreate,这将解释您的情况发生了什么。

因此,解决方案是将 EditText 值的设置移动到您的onResume方法(或覆盖onRestoreInstanceState)。

于 2012-05-08T03:59:44.223 回答
1

我决定深入研究savedInstanceState传递给onCreate方法的那个,我发现了这个:

键:android:viewHierarchyState
值:Bundle

该捆绑包具有以下键值对:

键:android:views
值:SparseArray

SparseArray有这个价值:TextView.SavedState{41857898 start=4 end=4 text=Boop}

那么发生的事情是Android正在自动恢复一些Views的状态,大概是在onRestoreInstanceState方法中。

为了防止这种行为,在 XML 中,将此行添加到您的EditText:

android:saveEnabled="false"

要以编程方式执行此操作,请调用view.setSaveEnabled(false).

于 2012-05-08T04:46:29.277 回答
0

是的。重新创建活动时,无法在 onCreate 中设置 edittext 的任何值。你应该改变 onResume()。

于 2012-05-08T03:49:13.473 回答