Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin MvvmCross Android阻止后退按钮返回上一视图_C#_Android_Xamarin_Mvvmcross - Fatal编程技术网

C# Xamarin MvvmCross Android阻止后退按钮返回上一视图

C# Xamarin MvvmCross Android阻止后退按钮返回上一视图,c#,android,xamarin,mvvmcross,C#,Android,Xamarin,Mvvmcross,我试图为以下情况创建一个简洁的解决方案: 我已经构建了一个需要凭据才能验证用户身份的应用程序。每当API想要重新验证用户时,我都会强制用户返回登录视图。此功能非常有效,但当用户按下设备上的后退按钮时,会显示上一视图。我希望看到当用户按下后退按钮时,应用程序退出 MvvmCross可以选择使用。我创建了CustomAndroidViewPresenter并创建了以下MvxAndroidSetup: public class Setup : MvxAndroidSetup { private

我试图为以下情况创建一个简洁的解决方案:

我已经构建了一个需要凭据才能验证用户身份的应用程序。每当API想要重新验证用户时,我都会强制用户返回登录视图。此功能非常有效,但当用户按下设备上的后退按钮时,会显示上一视图。我希望看到当用户按下后退按钮时,应用程序退出

MvvmCross可以选择使用。我创建了CustomAndroidViewPresenter并创建了以下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;
    }
}
我知道你应该叫Finish();在活动上,以防止backbutton导航回未经身份验证的视图。但将applicationContext强制转换为将引发异常

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);
}
有人知道如何实现这一点吗


非常感谢。我也有同样的问题。如果您想实现以下目标,只需实现一个自定义演示器,该演示器设置一些意图标志:

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);
        }
    }
然后,您需要在设置类中设置此演示者:

protected override IMvxAndroidViewPresenter CreateViewPresenter()
        {
            var presenter = new CustomAndroidPresenter();
            Mvx.RegisterSingleton<IMvxViewPresenter>(presenter);
            return presenter;
        }
受保护的覆盖IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter=new CustomAndroidPresenter();
Mvx.RegisterSingleton(演示者);
返回演讲者;
}
然后要显示viewmodel(如登录视图),只需设置自定义标志键代码,演示者知道他应该设置inten标志:

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>();
    }
受保护的void showview模型(bool clearbackback),其中TViewModel:MvxViewModel
{
if(clearbackstack)
{
var presentationBundle=new MvxBundle(新字典{{“MyCustomFlag”,“”});
ShowViewModel(presentationBundle:presentationBundle);
返回;
}
//正常启动
ShowViewModel();
}
要显示viewmodel(无反向导航),只需使用以下代码:

ShowViewModel<MyViewModel>(true);
ShowViewModel(true);

然后,当您按下“后退”按钮时,您无法导航回上一个活动,因为“后退”已清除。

您可以利用顶部活动生命周期方法

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();
        }
    }
}
公共类登录活动:mvxappcompativity
{   
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.activity\u登录);
}
/// 
///导航到新活动后从历史记录中删除活动。
/// 
受保护的覆盖void OnStop()
{
base.OnStop();
完成();
}
/// 
///如果按下后退按钮,则关闭应用程序。
/// 
public override void OnBackPressed()
{
如果(FragmentManager.BackbackEntryCount>0)
{
FragmentManager.PopBackStack();
}
其他的
{
base.OnBackPressed();
}
}
}

谢谢您的回复!我会关注它并给出我的反馈