2016-03-20 27 views
5

Mam aktywność, która obsługuje fragmenty w układzie ramek. Jeśli zmienię wyświetlany fragment na inny, fragment nie zostanie dodany do tylnego stosu i dlatego użycie przycisku "Powrót" spowoduje bezpośrednie zamknięcie aplikacji zamiast nawigacji wstecz (FragmentManager.BackStackEntryCount jest zawsze 0 w OnBackPressed()-oddzwonić).Jak dodać fragment do backstack w MvvmCross 4.0?

W ViewModel z „główną działalność”, na którym znajduje się fragmenty pokazać fragmentu poprzez ShowViewModel <> metoda:

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

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

Fragment klasy ma adnotacji przypisania viewmodel do hoście aktywność:

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

używam domyślnego AndroidViewPresenter w moim setup-Klasa:

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

Spodziewałem się parametru "AddToBackstack" lub podobnego w MvxFragment-Attribut lub w klasie MvxFragment, ale nie ma nic takiego. Czy coś mi brakuje lub czy obecnie nie ma wsparcia dla back-stacka w nowym mechanizmie fragmentów w MvvmCross 4.0?

Odpowiedz

5

Co można zrobić, to dodać coś takiego do swojego 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); 
     } 

Spowoduje to dodanie fragmentu do backstack przed nawigacja dzieje.

0

myślę, że to jest tak proste, jak zmiana atrybutów na swoim fragmencie do

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

To z pewnością działa w v4.2.3