我在SO上找到了很多类似问题的例子,但不幸的是,没有一个答案符合我的要求.
我有不同的纵向和横向布局,我使用后堆栈,这既防止我使用setRetainState()
和使用配置更改 routine 的技巧.
我在文本视图中向用户显示某些信息,这些信息不会保存在默认处理程序中.当我仅使用活动编写应用程序时,以下几点效果很好:
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));
}
对于Fragment
,这只适用于非常特定的情况.具体来说,令人震惊的是替换一个片段,将其放入后堆栈,然后在显示新片段时旋转屏幕.据我所知,旧片段在被替换时不会收到对onSaveInstanceState()
的调用,但会以某种方式与Activity
保持链接,而这个方法会在其View
不再存在时被调用,因此在NullPointerException
中查找我的TextView
个结果中的任何一个.
此外,我发现在Fragment
中保留对TextViews
的引用并不是一个好主意,即使Activity
可以.在这种情况下,onSaveInstanceState()
实际上会保存状态,但是如果我在隐藏片段时旋转屏幕twice,问题就会再次出现,因为在新实例中不会调用它的onCreateView()
.
我想将onDestroyView()
中的状态保存到某个Bundle
类型的类成员元素中(实际上是更多的数据,而不仅仅是TextView
),并将that保存到onSaveInstanceState()
中,但还有其他缺点.首先,如果当前显示的是片段is,则调用这两个函数的顺序是相反的,因此我需要考虑两种不同的情况.必须有一个更干净、更正确的解决方案!