2016-03-20 15 views
5

Ho un'attività che ospita frammenti in un frame-layout. Se cambio il frammento visualizzato in un altro, il frammento non viene aggiunto al back-stack e quindi l'uso del pulsante "Indietro" chiuderà immediatamente l'app anziché tornare indietro (FragmentManager.BackStackEntryCount è sempre 0 in OnBackPressed()-richiama).Come aggiungere un frammento al backstack in MvvmCross 4.0?

Nel ViewModel del "MainActivity" che ospita i frammenti che mostrano il frammento tramite lo ShowViewModel <> -method:

public class MainViewModel : MvxViewModel 
{ 
    public IMvxCommand ShowHomeCommand 
    { 
     get { return new MvxCommand(ShowHomeExecuted); } 
    } 

    private void ShowHomeExecuted() 
    { 
     ShowViewModel<HomeViewModel>(); 
    } 
} 

Il frammento-classe ha un'annotazione per assegnare il ViewModel ad un host- attività:

[MvxFragment(typeof(MainViewModel), Resource.Id.fragment_container)] 
[Register("namespace.of.HomeFragment")] 

io uso il default AndroidViewPresenter nel mio Setup-classe:

protected override IMvxAndroidViewPresenter CreateViewPresenter() 
{ 
    var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies); 
    Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter); 
    return mvxFragmentsPresenter; 
} 

Mi aspettavo un parametro "AddToBackstack" o simile nel MvxFragment-Attribut o nella classe MvxFragment ma non c'è nulla di simile. Mi manca qualcosa o al momento non c'è alcun supporto per lo stack nel nuovo meccanismo dei frammenti in MvvmCross 4.0?

risposta

5

Che cosa si può fare è aggiungere qualcosa di simile al tuo MainActivity:

public override void OnBeforeFragmentChanging (IMvxCachedFragmentInfo fragmentInfo, Android.Support.V4.App.FragmentTransaction transaction) 
     { 
      var currentFrag = SupportFragmentManager.FindFragmentById (Resource.Id.content_frame) as MvxFragment; 

      if(currentFrag != null 
       && fragmentInfo.ViewModelType != typeof(MenuViewModel) 
       && currentFrag.FindAssociatedViewModelType() != fragmentInfo.ViewModelType) 
       fragmentInfo.AddToBackStack = true; 
      base.OnBeforeFragmentChanging (fragmentInfo, transaction); 
     } 

Questo aggiungerà il frammento al backstack prima della navigazione accade.

0

penso che sia semplice come cambiare gli attributi sul frammento di

[MvxFragment(typeof(MainViewModel), Resource.Id.fragment_container, AddToBackStack = true)] 
[Register("namespace.of.HomeFragment")] 

Questo funziona sicuramente in v4.2.3