0

erstellen App mit einem Fragmente einen Button id = Taste InAndroid CommitNow stellt nicht onCreateView von onCreate

@Override 
    protected void onStart() { 
     super.onStart(); 
     getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.activity_main, new Testfrag()) 
       .commitNow(); 
     View b = findViewById(R.id.button); 

    } 

b enthält, als die Schaltfläche und die Fragmente zurück onCreateView vor dem Ende des Verfahrens genannt wird. Aber in

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
FragmentManager fm= getSupportFragmentManager(); 
     fm.beginTransaction() 
      .add(R.id.activity_main, new Testfrag()) 
     .commitNow(); 
    View b = findViewById(R.id.button); 
} 

b null ist und die Fragmente onCreateView erst nach endet das Verfahren genannt. Dies kann ein "Feature" sein, aber es gibt nichts in der Dokumentation.

Warum verhält sich Commit jetzt anders in onCreate - ruft onCreateView erst später und onStart (oder einem anderen Event-Handler), wo onCreateView wird synchron aufgerufen?

Antwort

0

Ich bin ehrlich überrascht, dass der erste funktioniert.

Wenn ich wetten musste, ruft das FragmentManager die Fragmentlebenszyklus-Rückrufe nicht über den aktuellen Lebenszyklus der Aktivität hinaus auf. Von onCreate() wird es onAttach() dann onCreate() auf dem Fragment anrufen. Irgendwann zwischen onCreate und onStart schließt der FragmentManager den Layoutprozess ab, indem er onCreateView() für jedes Fragment aufruft, das bisher festgeschrieben wurde. Dann wird onStart() für jedes Fragment aufgerufen, wenn die Aktivität gestartet wurde.

Wenn Sie ein Fragment in einem späteren Callback übergeben, sagen Sie onResume(). Der FragmentManager muss das Fragment bis zu dem bestimmten Punkt einrichten, also wird es den gesamten Lebenszyklus onAttach(), onCreate(), , onStart() und schließlich onResume() auf einmal gehen. Jetzt würde das Fragment dem Rest der Aktivität eingeholt werden.

Im Allgemeinen gibt es keinen Grund für eine Aktivität, direkten Zugriff auf interne View-Elemente zu haben. Das Fragment behandelt die Ansichtsereignisse. Übergibt die Ereignisse bei Bedarf an die Aktivität zurück. Auf diese Weise können Sie das Layout des Fragments beliebig ändern, ohne die Aktivität ändern zu müssen. Außerdem können Sie ein Fragment in verschiedenen Aktivitäten wiederverwenden.

+0

Dies ist eine interessante Idee und Dokumentation, wie Aktivitäts- und Fragmentlebenszyklen zusammenpassen, ist nicht klar. Wenn Sie jedoch ein Fragment mit dem Tag einfügen, ruft der FragmentManager in den Aktivitäten OnCreate OnCreateView auf. Ich werde sehen, ob ich mehr darüber erfahren kann, wie die beiden Lebenszyklen synchronisieren. –

+0

@MikeJames Ich fand es am besten, die beiden Lebenszyklen überhaupt nicht miteinander zu verknüpfen. Die Lebenszyklen eines Fragments werden sehr komplex, wenn Sie beispielsweise einen ViewPager verwenden. Betrachten Sie sie als zwei getrennte Entitäten. – DeeV

+0

Ich kann sehen, dass das Ignorieren jeglicher Synchronisation zwischen Aktivitäts- und Fragment-Lebenszyklus eine Vereinfachung ist, wenn Sie über das Entwerfen eines Fragments nachdenken, aber in diesem Fall wurde vorgeschlagen, dass es wesentlich ist zu verstehen, was passiert. Die Hypothese ist, dass die Aktivität den Zustand des Fragments nicht weiter "pusht", als dies zu diesem Zeitpunkt der Fall wäre. Ich versuche immer noch herauszufinden, ob das tatsächlich passiert. –

Verwandte Themen