阻止用户返回上一个活动

Posted

技术标签:

【中文标题】阻止用户返回上一个活动【英文标题】:Prevent user from returning to last activity 【发布时间】:2016-03-10 13:32:37 【问题描述】:

我正在开发一个 Xamarin.Forms 项目,并在我的 PCL 中创建了名为“Login.xaml”的启动页面。在此页面上,用户必须填写他们的凭据并将其发送到 WebAPI。当 API 返回“1”/true 时,它​​会打开一个名为“Home.xaml”的新页面。

如何防止用户在按下手机上的返回按钮时返回登录页面?即:用户在第一页登录,webapi 对其进行验证并返回一个“1”,因此新页面(“主页”)被打开,但是当用户按下返回按钮时,它返回到登录屏幕。在应用关闭之前,这应该是不可能的。

【问题讨论】:

【参考方案1】:

您可以在推送Home.xaml 时从导航堆栈中删除登录页面:

await Navigation.PushAsync(new Home());  // or whatever your page is called
Navigation.RemovePage(this);

这样你的用户进入主页后就没有什么可返回的了。

为此,您的登录页面必须是NavigationPage。为此,您必须使用 NavigationPage ctor 包装它:

// this goes into your App.cs where you enter your app:
public App()

    MainPage = new NavigationPage(new Login()); // or whatever your login page is called

我建议你看看文档:Introduction to Xamarin Forms - Navigation

【讨论】:

感谢您的回答,但我收到以下错误:System.InvalidOperationException: RemovePage is not supported globally on android, please use a NavigationPage. 我会澄清更多。使用await Navigation.PushAsync(new Home()); Navigation.RemovePage(this); 时出现以下错误:PushAsync is not supported globally on Android, please use a NavigationPage. 但使用PushModalAsync 时出现System.InvalidOperationException: RemovePage is not supported globally on Android, please use a NavigationPage. 我自己已经弄清楚了,标记为答案。谢谢!【参考方案2】:

对我来说,打电话给RemovePage() 给我带来了各种各样的问题。

我必须做的是改变我的想法。如果您使用Pop 而不是Push,那么您实际上是在永久删除该页面。那么你需要做什么才能做 Pop 而不是 Push 呢?先在当前页之前插入下一页,再Pop:

var newRootPage = new NewRootPage();
this.Navigation.InsertPageBefore(newRootPage, this);
await this.Navigation.PopAsync();

注意:要使其正常工作,您还需要将初始根页面包装在 NavigationPage 中,就像@germi 在他的回答的最后一部分中所说:

// this goes into your App.cs where you enter your app:
public App()

    // or whatever your login page is called
    MainPage = new NavigationPage(new Login()); 

PS:FWIW this was my fix 在我的 F# 开源项目中。

【讨论】:

以上是关于阻止用户返回上一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Android阻止恢复活动

对话框会阻止其余代码执行吗?

Firebase 总是返回“由于异常活动,我们已阻止来自此设备的所有请求。请稍后再试。”

Chromecast - 阻止 loadMedia 直到前一个返回

如何防止回到之前的活动?

Android:仅阻止单个活动访问互联网