1

在 Google Api 示例代码中,他们有一个关于保存状态的非常简单的示例。我需要这个来处理屏幕旋转。

getSavedText()我的问题是我不明白方法setSaveText()从哪里调用。我把调试器放在他们身上,但它永远不会被触发。整个事情只是通过“魔术”起作用。我还能节省哪些其他东西?我在哪里可以找到解释魔法的文档

public class SaveState extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_save_state);
    ((TextView)findViewById(R.id.msg)).setText(R.string.hello_world);
}
CharSequence getSavedText() {
    return ((EditText)findViewById(R.id.saved)).getText();
}
void setSavedText(CharSequence text) {
    ((EditText)findViewById(R.id.saved)).setText(text);
} 
}

链接 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/SaveRestoreState.html

备用链接 http://goo.gl/6TJy5

4

1 回答 1

1

这个 Api Demo 示例很糟糕,因为当您阅读文档时,您期望它会覆盖 onSaveInstanceState() 方法而不是在 onCreate() 或 onRestoreInstanceState() 中使用持久状态,这令人困惑,但事实并非如此。

首先 getSavedText() 和 setSavedText() 方法没有在这个Save & Restore State活动中使用。它们在LocalSample Instrumentation示例中使用/调用。

忘记这两种方法可以擦除它们。让我们来看看这个示例是如何工作的;在后台 Android 调用onRestoreInstanceState()并使所有 UI 视图将其状态保持到方法的 Bundle 参数。请调试代码并在旋转屏幕后检查此示例的 onCreate() 方法中的 savedInstanceState 参数。您将在该 Bundle 中看到 R.id.saved EditText 的旋转文本之前。主要技巧是,为什么 EditText 之一保存其状态而另一个不保存是因为 EditText 的freezesText属性。freezesText 属性使 EditText/TextView 将其状态保存在 onSaveInstanceState 方法中。请在此处查看有关 freezesText 的更多信息。

删除 android:freezesText="true" 或从 save_restore_state.xml 将其设为 false 或覆盖 onRestoreInstanceState 方法,不要调用 super.onRestoreInstanceState() 并观察它在旋转后失去其状态(配置更改)。

注意:您不必为此示例重写 onRestoreInstanceState 方法,但对于保存 Activity 的内部状态的其他要求,您必须这样做。

于 2013-02-20T01:45:06.300 回答