Tôi đã viết lên một hoạt động giả chuyển đổi giữa hai mảnh. Khi bạn đi từ FragmentA đến FragmentB, FragmentA sẽ được thêm vào ngăn xếp phía sau. Tuy nhiên, khi tôi trở lại FragmentA (bằng cách nhấn lại), một FragmentA hoàn toàn mới được tạo ra và trạng thái của nó bị mất. Tôi có cảm giác tôi giống như câu hỏi này , nhưng tôi đã bao gồm một mẫu mã hoàn chỉnh để giúp giải quyết vấn đề:
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);
}
}
}
Với một số thông điệp tường trình được thêm vào:
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
Nó không bao giờ gọi FragmentA.onSaveInstanceState và nó tạo ra một FragmentA mới khi bạn quay lại. Tuy nhiên, nếu tôi ở trên FragmentA và tôi khóa màn hình, FragmentA.onSaveInstanceState sẽ được gọi. Thật kỳ lạ ... tôi có sai không khi mong đợi một đoạn được thêm vào ngăn xếp phía sau để không cần tạo lại? Đây là những gì các tài liệu nói:
Trong khi đó, nếu bạn gọi addToBackStack () khi xóa một đoạn, thì đoạn đó sẽ bị dừng và sẽ được nối lại nếu người dùng điều hướng trở lại.
ListView
. Có vẻ như nhảy quá nhiều để gắn một trình nghe cuộn và cập nhật một biến thể hiện.