我在SO上发现了许多类似问题的实例,但不幸的是没有答案符合我的要求。
我有不同的纵向和横向布局,我使用背堆栈,这都阻止我使用setRetainState()
和使用配置更改例程的技巧。
我在TextViews中显示某些信息给用户,这些信息不会保存在默认处理程序中。当我只使用Activities编写应用程序时,以下工作得很好:
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
s,这只在非常特定的情况下有效。具体来说,最糟糕的是替换一个片段,将其放入back堆栈,然后在显示新片段时旋转屏幕。据我所知,旧片段在被替换时不会接收到对onSaveInstanceState()
的调用,但以某种方式保持与Activity
的链接,当它的View
不再存在时,此方法稍后被调用,因此寻找任何我的# eyz4结果为NullPointerException
。
此外,我发现保持我的TextViews
对Fragment
s的引用不是一个好主意,即使它对Activity
的是OK的。在这种情况下,onSaveInstanceState()
实际上保存了状态,但如果我在片段隐藏时旋转屏幕两次,问题就会再次出现,因为它的onCreateView()
在新实例中没有被调用。
我想过将onDestroyView()
中的状态保存到一些# eyz1类型的类成员元素中(它实际上是更多的数据,而不仅仅是一个TextView
),并将那保存在onSaveInstanceState()
中,但还有其他缺点。首先,如果片段是当前显示,则调用两个函数的顺序颠倒了,因此我需要考虑两种不同的情况。一定会有更干净和正确的解决方案!