【问题标题】:Changing the value of an EditText inside onCreate() has no effect when changing device orientation更改设备方向时,在 onCreate() 中更改 EditText 的值无效
【发布时间】:2012-05-08 03:40:39
【问题描述】:

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

【问题讨论】:

  • 当方向改变时需要检查,oncreate 方法已被调用。
  • 听起来您在 AndroidManifest.xml 中明确定义了 android:configChanges。查看Activity API - Configuration Changes section 了解如何更改默认行为。
  • @yorkw:刚刚检查过,AndroidManifest.xml 没有提及 android:configChanges。

标签: java android mobile android-activity


【解决方案1】:

这是因为 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 )。

【讨论】:

  • 嗯,好的。正如您提到的,我没有任何包含在 if 语句中的内容。如果在 onCreate() 完成后 Android 正在做任何这种娱乐,那么我所看到的将是有道理的。你知道是不是这样吗?
  • 嗯,如果你没有那个 if 语句,那么我支持你。我相信它应该重新设置 EditText。我会多看看,看看我能不能想出一个合理的解释。只是一些背景信息..这个应用程序使用片段吗?
  • 啊,有道理。非常感谢!
【解决方案2】:

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

密钥: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)

【讨论】:

  • 这个答案刚刚救了我的培根。谁投了反对票?疯狂的。当我的活动被旋转时,我绝对无法弄清楚 EditTexts 发生了什么。此外,我的活动中的 EditTexts 是自定义“复合”视图(RelativeLayout 中的 EditText 和 FilterSpinner)的一部分,我不能简单地对活动的 onResume 中的 EditTexts 进行更新(甚至不认为活动要注意“复合”视图中的 EditTexts!)。我只是在“复合”视图的 XML 布局中将 EditText 的 saveEnabled 键设置为 false,现在一切都按预期工作。谢谢!
【解决方案3】:

是的。当activity重新创建时,edittext不能在onCreate中设置任何值。 你应该改变 onResume()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多