2015-03-12 11 views
5

Próbuję utworzyć schludny rozwiązanie dla następującej sytuacji:Xamarin MvvmCross Android Prevent Powrót Przycisk powrotu do poprzedniego widoku

ja już zbudować aplikację, która wymaga poświadczeń w celu uwierzytelnienia użytkownika. Ilekroć API chce ponownie uwierzytelnić użytkownika, chciałbym zmusić użytkownika do powrotu do widoku logowania. Ta funkcja działa świetnie, ale gdy użytkownik naciśnie przycisk Wstecz na urządzeniu, wyświetlany jest poprzedni widok. Chciałbym zobaczyć, że gdy użytkownik naciśnie przycisk Wstecz, aplikacja wychodzi.

MvvmCross ma opcję użycia MvxPresentationHint. I stworzył CustomAndroidViewPresenter i stworzył następującą MvxAndroidSetup:

public class Setup : MvxAndroidSetup 
{ 
    private CustomAndroidViewPresenter _presenter; 
    public Setup(Context applicationContext) 
     : base(applicationContext) 
    { 
     _presenter = new CustomAndroidViewPresenter(applicationContext); 
    } 

    protected override IMvxAndroidViewPresenter CreateViewPresenter() 
    { 
     Mvx.RegisterSingleton(_presenter); 
     return _presenter; 
    } 
} 

wiem, że należy zadzwonić Finish(); na działanie, które uniemożliwi powrót plecaka do nieuwierzytelnionego widoku. Ale rzutowanie applicationContext wywołuje wyjątek.

public CustomAndroidViewPresenter(Context context) 
{ 
    _context = context; 
} 

public override void ChangePresentation(MvxPresentationHint hint) 
{ 
    if (hint is LoginOnlyBackStackHint) 
    { 
     var context = Application.Context; 
     if (context is Activity) 
     { 
      // Context is NOT activity 
     } 
     try 
     { 
      Activity x = (Activity) context; 
      x.Finish(); 
      // Exception is thrown 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
    base.ChangePresentation(hint); 
} 

Czy ktoś ma jakieś pomysły, jak to osiągnąć?

Wielkie dzięki z góry.

Odpowiedz

11

Miałem ten sam problem. Wystarczy wdrożyć zwyczaj, prezenter, który wyznacza pewne zamiarom flagi, jeśli chcesz achive to:

public class CustomAndroidPresenter : MvxAndroidViewPresenter 
    { 
     public override void Show(MvxViewModelRequest request) 
     { 
      if (request != null && request.PresentationValues != null) 
      { 
       if (request.PresentationValues.ContainsKey("MyCustomFlag")) 
       { 
        // Get intent from request and set flags to clear backstack. 
        var intent = base.CreateIntentForRequest(request); 
        intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask); 

        base.Show(intent); 
        return; 
       } 
      } 

      base.Show(request); 
     } 
    } 

Następnie trzeba ustawić ten prezenter w swojej klasie Setup:

protected override IMvxAndroidViewPresenter CreateViewPresenter() 
     { 
      var presenter = new CustomAndroidPresenter(); 
      Mvx.RegisterSingleton<IMvxViewPresenter>(presenter); 
      return presenter; 
     } 

A potem pokazać ViewModel (jak Twój login-view) po prostu ustawić niestandardowy-flag-key-code, że prezenter nie wie, że powinien ustawić inten-flagi:

protected void ShowViewModel<TViewModel>(bool clearbackstack) where TViewModel : MvxViewModel 
     { 
      if (clearbackstack) 
      { 
       var presentationBundle = new MvxBundle(new Dictionary<string, string> { { "MyCustomFlag", "" } }); 
       ShowViewModel<TViewModel>(presentationBundle: presentationBundle); 
       return; 
      } 

     // Normal start 
     ShowViewModel<TViewModel>(); 
    } 

pokazać ViewModel (bez back-nawigacyjny) wystarczy użyć follo Kod Skrzydło:

ShowViewModel<MyViewModel>(true); 

A potem, po naciśnięciu przycisku wstecz nie można poruszać się z powrotem do swojej poprzedniej pracy, ponieważ backstack rozjaśnia.

+0

Dzięki za odpowiedź! Zajrzę do niego i przekażę moją opinię – JonHendrix

+0

To zadziałało! Oznaczone jako odpowiedź - dzięki! – JonHendrix

1

Możesz skorzystać z metody cyklu życia OnStop Activity.

public class LoginActivity : MvxAppCompatActivity<LoginViewModel> 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.activity_login); 
    } 

    /// <summary> 
    /// Removes activity from history after navigating to new activity. 
    /// </summary> 
    protected override void OnStop() 
    { 
     base.OnStop(); 
     Finish(); 
    } 

    /// <summary> 
    /// Closes app if back button is pressed. 
    /// </summary> 
    public override void OnBackPressed() 
    { 
     if (FragmentManager.BackStackEntryCount > 0) 
     { 
      FragmentManager.PopBackStack(); 
     } 
     else 
     { 
      base.OnBackPressed(); 
     } 
    } 
} 
Powiązane problemy