ฉันเขียนกิจกรรมจำลองที่สลับระหว่างสองชิ้น เมื่อคุณไปจาก FragmentA ถึง FragmentB FragmentA จะถูกเพิ่มเข้าไปในกองหลัง อย่างไรก็ตามเมื่อฉันกลับไปที่ 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 () เมื่อลบแฟรกเมนต์แฟรกเมนต์จะหยุดทำงานและจะกลับมาทำงานต่อหากผู้ใช้นำทางกลับ
ListView
ยกตัวอย่างเช่นเลื่อนตำแหน่งของ ดูเหมือนว่าห่วงมากเกินไปที่จะแนบผู้ฟังเลื่อนและปรับปรุงตัวแปรอินสแตนซ์