最佳答案
我写了一个在两个片段之间切换的虚拟活动。当你从片段 A 到片段 B 时,片段 A 会被添加到回栈中。然而,当我返回到 FragmentA 时(通过按回键) ,一个全新的 FragmentA 被创建,并且它所处的状态丢失了。我有一种感觉,我在寻找与 这个问题相同的东西,但我已经包含了一个完整的代码示例,以帮助根除这个问题:
public class FooActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentA());
transaction.commit();
}
public void nextFragment() {
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentB());
transaction.addToBackStack(null);
transaction.commit();
}
public static class FragmentA extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View main = inflater.inflate(R.layout.main, container, false);
main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((FooActivity) getActivity()).nextFragment();
}
});
return main;
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save some state!
}
}
public static class FragmentB extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.b, container, false);
}
}
}
添加了一些日志消息:
07-05 14:28:59.722 D/OMG ( 1260): FooActivity.onCreate
07-05 14:28:59.742 D/OMG ( 1260): FragmentA.onCreateView
07-05 14:28:59.742 D/OMG ( 1260): FooActivity.onResume
<Tap Button on FragmentA>
07-05 14:29:12.842 D/OMG ( 1260): FooActivity.nextFragment
07-05 14:29:12.852 D/OMG ( 1260): FragmentB.onCreateView
<Tap 'Back'>
07-05 14:29:16.792 D/OMG ( 1260): FragmentA.onCreateView
它从来不会调用 FragmentA.onSaveInstanceState,当您回击时,它会创建一个新的 FragmentA。但是,如果我在 FragmentA 上并锁定屏幕,那么会调用 FragmentA.onSaveInstanceState。太奇怪了... 我是不是错误地认为添加到后面堆栈的片段不需要重新创建?医生是这么说的:
然而,如果在删除片段时调用 addToBackStack () , 然后停止该片段,并在用户导航时恢复该片段 回来。