2013-02-19 5 views
6

Ich versuche zu entscheiden und zeigen ein Fragment in Aktivität onResume Methode, aber in dem Fall, dass ein zuvor hinzugefügtes Fragment erneut gewählt wird, dann wird die Aktivität leer.Ersetzen eines Fragments mit sich selbst zeigt nichts

Beispielcode (mit einem Fragmente):

@Override 
protected void onResume(){ 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 

Mit obigem Code, wenn die Aktivität zum ersten Mal erstellt wird, zeigt es Fraga richtig, aber falls ich drücke Home-Taste und dann zurück zu meiner Aktivität wechseln (um onResume wieder zu provozieren), es wird alles leer (scheint wie fragA entfernt wird).

Wird ein zuvor hinzugefügtes Fragment ersetzt? oder wie man ein Fragment nicht verliert, wenn es von selbst ersetzt wird?

Antwort

4

Sie können ein Fragment nicht durch sich selbst ersetzen. Die erste Hälfte einer Ersetzung ist eine Entfernung des vorherigen Fragments bei dieser ID. Sobald ein Fragment entfernt wurde, kann es nicht mehr vom Fragmentmanager hinzugefügt oder verwendet werden (der Add-Teil des Ersetzens funktioniert dann nicht ordnungsgemäß).

Je nach Anwendungsfall, haben Sie zwei Möglichkeiten:

  1. ein neues Fragment erstellen, anstatt die Wiederverwendung der vorhandenen Instanz
  2. Verwenden einer anderen Methode, um zu sehen, ob seine notwendige Ihr Fragment zu ersetzen

Schließlich müssen Sie möglicherweise ExecutePendingTransactions nicht aufrufen.

+0

Ich initialisiere ** fragA ** in * onCreate *, was bedeutet, dass ich den Verweis auf mein Fragment behalte. Also warum erlaubt es nicht, es nach dem Entfernen dieses Fragments hinzuzufügen? – waqaslam

+0

Wegen genau das, was ich gesagt habe. Sobald Sie eine Instanz eines Fragments entfernen, können Sie sie nicht mehr hinzufügen. Es ist zerstört, fertig, nicht mehr verwendbar. –

+0

Eine andere Sache zu überprüfen ist, dass R.id.myLayout die ID des Containers ist, in den Sie Ihr Fragment einfügen möchten. Wenn dies der Fall ist, versuchen Sie, den Ersetzungsaufruf zu ersetzen (R.id.myLayout, new FragmentClass()) –

4

können Sie versuchen:

if(!(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA)) { 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
} 

Und ich nehme an, dass Fraga ist fragmenta Klassenobjekt.

+0

'R.id.myLayout' zeigt auf das Layout, in das ** fragA ** injiziert wird. Ich denke nicht, dass 'findFragmentById (R.id.myLayout)' mir einen Verweis auf mein Fragment zurückgibt. – waqaslam

+0

Wenn sich Ihr Fragment in diesem Container befindet, gibt es einen Verweis auf dieses injizierte Fragment zurück. Dann können Sie überprüfen, ob es sich um eine Instanz der Klasse Ihres Fragments handelt. –

+0

das funktioniert, und es ist eine ziemlich interessante Lösung, wenn Sie Fragmente in Fragmenten erstellen. –

3

Schließlich musste ich einen Haken setzen, bevor ich Fragmente ersetzen konnte. Falls ein (bereits hinzugefügtes) Fragment erneut zum Ersetzen angefordert wird, musste ich prüfen, ob es bereits hinzugefügt wurde, und dann die Ersetzung ignorieren, andernfalls fortfahren. Beispiel:

@Override 
protected void onResume() { 
    if (!fragA.isAdded()) { 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.myLayout, fragA); 
     trans.commit(); 
     //getSupportFragmentManager().executePendingTransactions(); //unnecessary 
    } 
}