【发布时间】:2013-02-25 03:42:38
【问题描述】:
我在 SO 上发现了许多类似问题的实例,但遗憾的是没有答案符合我的要求。
我有不同的纵向和横向布局,并且我正在使用后堆栈,这既阻止了我使用 setRetainState() 又阻止了我使用配置更改例程的技巧。
我在 TextViews 中向用户显示某些信息,这些信息不会保存在默认处理程序中。仅使用活动编写我的应用程序时,以下内容运行良好:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
对于Fragments,这仅适用于非常特定的情况。具体来说,最糟糕的是替换片段,将其放入后堆栈,然后在显示新片段时旋转屏幕。据我了解,旧片段在被替换时没有收到对onSaveInstanceState() 的调用,但仍以某种方式与Activity 链接,并且稍后在其View 不再存在时调用此方法,因此寻找任何我的TextViews 结果为NullPointerException。
另外,我发现使用Fragments 保留对我的TextViews 的引用并不是一个好主意,即使Activity 的引用是可以的。在这种情况下,onSaveInstanceState() 实际上保存了状态,但如果我在片段隐藏时旋转屏幕两次,问题会再次出现,因为它的onCreateView() 不会在新实例中被调用。 p>
我想将onDestroyView() 中的状态保存到某个Bundle 类型的类成员元素中(实际上是更多数据,而不仅仅是一个TextView)并将那个保存在onSaveInstanceState()但还有其他缺点。首先,如果片段 当前显示,调用这两个函数的顺序是相反的,所以我需要考虑两种不同的情况。必须有一个更清洁和正确的解决方案!
【问题讨论】:
-
我支持 emunee.com 链接。它为我解决了一个 UI 问题!