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.

  • Durchsuchen SQLite-Datenbank aus Android Studio
  • Android-Appcompat-Symbolleiste dehnt sich aus, wenn Suchansicht Fokus erhält
  • Welcher Teil des Android-Software-Stacks behandelt Befehle über die Kopfhörerbuchse? (ZB Anrufe mit einem Headset beantworten)
  • Starten Sie die Aktivität innerhalb von Receive BroadcastReceiver
  • Was ist die Android-ADB-Shell "Dumpsys" -Tool und was sind ihre Vorteile?
  • Erkennung, welches ausgewählte Element (in einem ListView) das ContextMenu (Android)
  • 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.

  • Wann sollte ich die Berechtigung ACCESS_COARSE_LOCATION verwenden?
  • Web-Farben in einer Android-Xml-Ressource-Datei
  • Fragment saveInstanceState kommt nach der Orientierungsänderung als Null
  • "App-release.apk", wie man diesen standardmäßig erzeugten apk-Namen ändert
  • View Pager mit Universal Image Loader aus Speicherfehler
  • Android Wie benutzt man Environment.getExternalStorageDirectory ()
  • 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.