Aktivität und Fragment Lebenszyklen und Orientierungsänderungen

Ich habe sehr seltsame Probleme mit Fragments und Orientierungsänderungen, die Kräfte verursacht haben und nicht nach einem logischen Muster.

Ich habe eine einfache Activity und Fragment Lifecycle Debugging-Anwendung, die einfach implementiert jeden Schritt der Aktivität Lebenszyklus und Fragment Lebenszyklus durch die Berichterstattung der Aufruf der Logcat.

Hier sind die TestActivity und TestFragment Klassen:

TestAktivität

 public class TestActivity extends Activity { Context ct = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("ACT", "onCreate called"); ct = getApplicationContext(); FrameLayout fl = new FrameLayout(ct); fl.setId(1000); TestFragment tf = new TestFragment(); getFragmentManager().beginTransaction().add(fl.getId(), tf, "").commit(); setContentView(fl); } @Override protected void onStart() { Log.e("ACT", "onStart called"); super.onStart(); } @Override protected void onResume() { Log.e("ACT", "onResume called"); super.onResume(); } @Override protected void onPause() { Log.e("ACT", "onPause called"); super.onPause(); } @Override protected void onStop() { Log.e("ACT", "onStop called"); super.onStop(); } @Override protected void onDestroy() { Log.e("ACT", "onDestroy called"); super.onDestroy(); } @Override protected void onRestart() { Log.e("ACT", "onRestart called"); super.onRestart(); } } 

TestFragment

 public class TestFragment extends Fragment { Context ctFrag = null; @Override public void onAttach(Activity activity) { Log.e("FRAG", "onAttach called"); super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("FRAG", "onCreate called"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e("FRAG", "onCreateView called"); ctFrag = ((TestActivity) getActivity()).ct; TextView tv = new TextView(ctFrag); tv.setText("My test TextView"); return tv; } @Override public void onActivityCreated(Bundle savedInstanceState) { Log.e("FRAG", "onActivityCreated called"); super.onActivityCreated(savedInstanceState); } @Override public void onStart() { Log.e("FRAG", "onStart called"); super.onStart(); } @Override public void onResume() { Log.e("FRAG", "onResume called"); super.onResume(); } @Override public void onPause() { Log.e("FRAG", "onPause called"); super.onPause(); } @Override public void onStop() { Log.e("FRAG", "onStop called"); super.onStop(); } @Override public void onDestroyView() { Log.e("FRAG", "onDestroyView called"); super.onDestroyView(); } @Override public void onDestroy() { Log.e("FRAG", "onDestroy called"); super.onDestroy(); } @Override public void onDetach() { Log.e("FRAG", "onDetach called"); super.onDetach(); } } 

Bei der Initialisierung folgt die Logcat-Ausgabe der erwarteten Reihenfolge (Start Activity , wenn das Fragment angehängt ist, seine Lifecycle-Aufrufe passieren usw.):

 01-29 10:12:50.270: E/ACT(3321): onCreate called 01-29 10:12:50.760: E/FRAG(3321): onAttach called 01-29 10:12:50.760: E/FRAG(3321): onCreate called 01-29 10:12:50.760: E/FRAG(3321): onCreateView called 01-29 10:12:50.770: E/FRAG(3321): onActivityCreated called 01-29 10:12:50.770: E/ACT(3321): onStart called 01-29 10:12:50.770: E/FRAG(3321): onStart called 01-29 10:12:50.770: E/ACT(3321): onResume called 01-29 10:12:50.770: E/FRAG(3321): onResume called 

Aber das Problem ist, wenn eine Orientierungsänderung auftritt, sagt die Android-Dokumentation :

Wenn eine solche Änderung auftritt, startet Android die laufende Aktivität (onDestroy () wird aufgerufen, gefolgt von onCreate ())

Was würde darauf hindeuten, dass es die Activity und seine Inhalte wie der Lebenszyklus vorschlagen sollte (und es tut), aber gehen Sie durch den gleichen geordneten Prozess, der die Activity in der neuen Orientierung neu erstellt. Dies geschieht nicht und es scheint, dass das Fragment versucht wird, neu erstellt zu werden, und dann wird ein neues in der Aktivitätserholung geschaffen.

 01-29 10:17:52.249: E/FRAG(3321): onPause called 01-29 10:17:52.259: E/ACT(3321): onPause called 01-29 10:17:52.269: E/FRAG(3321): onStop called 01-29 10:17:52.269: E/ACT(3321): onStop called 01-29 10:17:52.279: E/FRAG(3321): onDestroyView called 01-29 10:17:52.299: E/FRAG(3321): onDestroy called 01-29 10:17:52.299: E/FRAG(3321): onDetach called 01-29 10:17:52.299: E/ACT(3321): onDestroy called 01-29 10:17:52.650: E/FRAG(3321): onAttach called 01-29 10:17:52.650: E/FRAG(3321): onCreate called 01-29 10:17:52.650: E/ACT(3321): onCreate called 01-29 10:17:53.020: E/FRAG(3321): onCreateView called 01-29 10:17:53.020: E/FRAG(3321): onActivityCreated called 01-29 10:17:53.030: E/FRAG(3321): onAttach called 01-29 10:17:53.030: E/FRAG(3321): onCreate called 01-29 10:17:53.030: E/FRAG(3321): onCreateView called 01-29 10:17:53.030: E/FRAG(3321): onActivityCreated called 01-29 10:17:53.060: E/ACT(3321): onStart called 01-29 10:17:53.060: E/FRAG(3321): onStart called 01-29 10:17:53.060: E/FRAG(3321): onStart called 01-29 10:17:53.060: E/ACT(3321): onResume called 01-29 10:17:53.060: E/FRAG(3321): onResume called 01-29 10:17:53.060: E/FRAG(3321): onResume called 

Offensichtlich gibt es viele Lösungen, um das zu lösen, aber meine Frage ist, warum ist das passiert? Warum wird eine Fragment beibehalten und neu erstellt, wenn es darum geht, Teil dieser Activity die angeblich vollständig zerstört und neu erstellt wird? Ich kann das durch Fragment rechtfertigen, das absichtlich von den Aktivitäten getrennt ist. Aber was hat die Probleme verursacht, warum ist das ursprüngliche Fragment angebracht und neu erstellt, bevor die Activity ist? Es scheint einfach nicht, den logischen Lebenszyklus zu folgen, den der Rest des Android-Prozesses tut.

  • Misserfolg der Aktivität, wenn die Aktivität zerstört wurde
  • OnDestroy () - zu setzen oder nicht, um Instanzvariablen auf Null zu setzen?
  • ANDROID: Aktivitätszustand nach Drücken der Rücktaste
  • Öffentliche statische Variablen und Android-Aktivität Lebenszyklus-Management
  • Wiederherstellung des Status in Android bei Verwendung der 'up' Taste
  • Android - Halten Sie zuvor zusätzliche Absicht extra, wenn Sie auf die übergeordnete Aktivität
  • Was ist die richtige Reihenfolge der Aufruf von Superklasse Methoden in onPause, onStop und onDestroy Methoden? und warum?
  • BroadcastReceiver Lebenszyklus
  • 2 Solutions collect form web for “Aktivität und Fragment Lebenszyklen und Orientierungsänderungen”

    Dies geschieht, weil die Aktivität onSaveInstanceState(Bundle) bevor sie zerstört wird. Standardmäßig speichert die Aktivität die Zustände ihrer Fragmente in dieser Methode.

    Später, wenn die Aktivität neu erstellt wird, werden die alten Fragmente in der Aktivität onCreate(Bundle savedInstanceState) Methode neu erstellt.

    Vielleicht möchten Sie den Quellcode hier und hier überprüfen, um dieses Verhalten besser zu verstehen.

    Es ist, weil du das Fragment immer wieder hinzufügst, wird die Aktivität neu erstellt. Sie können den folgenden Code in der onCreate-Methode der Aktivität verwenden, um die Wiederherstellung von Fragment zu vermeiden:

     if(savedInstanceState == null) { mFragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); FragmentOne fragment = new FragmentOne(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); } 

    Wenn eine Konfigurationsänderung auftritt, wird das alte Fragment nicht zerstört – es fügt sich der Aktivität zurück, wenn es neu erstellt wird.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.