2017-06-16 3 views
1

Ich schaffe Viewmodel in MainFragment:Ansichtsmodell erstellt wird wieder für das Fragment

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ... 
    MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class); 
    ... 
} 

Wenn der Benutzer wählen Sie den Punkt dann zu Einzelheiten Fragment navigieren, diese Transaktion zu Backstack hinzugefügt wird.

getFragmentManager() 
       .beginTransaction() 
       .replace(R.id.root, Details.newInstance()) 
       .addToBackStack(null) 
       .commit(); 

Wenn der Benutzer drückt zurück in Einzelheiten Fragmente, ist alles in Ordnung, aber wenn Benutzer dreht Gerät in Einzelheiten Fragment und drücken damals:

  • neue Instanz von Viewmodel für MainFragment erstellt
  • alt Instanz ist noch am Leben (Methode onCleared nicht aufgerufen)

Ist das ein Fehler in ViewModelProviders? Wie behebe ich das? ViewModel sollte meiner Meinung nach wiederhergestellt werden.

+0

Haben Sie eine Lösung für dieses Problem gefunden? – SqueezyMo

Antwort

-1

Sie verwenden Link zu fragmentieren, sondern müssen Aktivität Einsatz:

MainViewModel mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class); 
+1

Dieses schlechte Idee Wenn ich das tue, wird jedes ViewModel so lange leben wie Aktivität. Ich will das nicht. Ich will ViewModel live so lange wie Fragment. –

+0

in welcher Methode Sie Fragment hinzufügen? –

+0

Ich fülle Fragmente in Callback, wenn Benutzer auswählen item in recyclerview –

1

Das ist nicht wirklich klar, aber wenn man addToBackStack aufrufen, wird das Fragment Manager Ihre Fragment nicht zerstören, hält es nur, wenn neue replace Transaktion kommt. Du hast jetzt im Grunde zwei Gegenstände auf dem Backstack, die beide Instanzen deines Details sind. Da onDestroy nie für die erste aufgerufen wurde, wurde seine ViewModel'sonCleared auch nie aufgerufen.

In Ihrem Fall, einfach zu überprüfen, ob Ihr Fragment zur Zeit in dem Behälter (zB über FragmentManager.findFragment() und NICHT ist es in einer solchen Situation zu ersetzen, sollte ausreichen.

Verwandte Themen