gpt4 book ai didi

android - 如何设置导航堆栈的根

转载 作者:行者123 更新时间:2023-12-04 23:49:38 25 4
gpt4 key购买 nike

我想要实现的是应用程序以 login page 开头登录后Main page应该显示。从那里可以打开其他页面并允许正常导航。
但是,我不希望用户导航回登录页面。登录后main page必须是导航的根。
我在谷歌上找到了很多关于如何做到这一点的信息,但它们似乎都不适合我。主要是我被告知要制作我的main page通过设置 MainPage直接到我的PageMain这也在我的代码中,但它不起作用。
其他方法应该是删除 login page从导航堆栈中,但我无法让它工作。我找到的示例编译但在运行时它们使我的应用程序崩溃,说我无法删除当前页面或找不到我要删除的页面。
这是我的代码:
我的应用程序以 PageLogin 开头,现在它只有一个按钮,当您单击它时,它会打开我的PageMain

private void ButtonLogin_Clicked(object sender, EventArgs e)
{
// almost does what I want
Application.Current.MainPage = new PageMain();

// almost does what I want
// make PageMain the new main page, so you cannot go back to the login screen
//Application.Current.MainPage = new NavigationPage(new PageMain());

// error you cannot remove the page you are on
//var _navigation = Application.Current.MainPage.Navigation;
//var _lastPage = _navigation.NavigationStack.LastOrDefault();
////Remove last page
//_navigation.RemovePage(_lastPage);
////Go back
//_navigation.PopAsync();

// error page does not exists
//Application.Current.MainPage.Navigation.RemovePage(this);

//Navigation.PopAsync(); not supported on android
//Navigation.RemovePage(this); not supported on android

}
MainPage 像这样在 App.xaml.cs 中设置
public partial class App : Application
{
public App()
{
InitializeComponent();
//MainPage = new NavigationPage(new Pages.PageLogin());
MainPage = new Pages.PageLogin();
}
上面的代码打开我的页面 PageMain到目前为止,一切都很好。
现在当我点击 back button设备,我的应用程序最小化(或任何它在 android 上隐藏自身)
这很好,因为我不希望用户返回 login form但是,当我现在点击 recent apps设备上的按钮,然后单击我的应用程序将其重新置于前台,它会移回登录表单。
看这个视频
enter image description here
我怎样才能避免这种情况?
编辑
我尝试设置 IsTabStop为假,也没有结果
public PageLogin()
{
InitializeComponent();
this.IsTabStop = false;
ButtonLogin.Clicked += ButtonLogin_Clicked;
}

最佳答案

这是纯粹的 Android 行为,与 Xamarin.Forms 无关,当您在应用程序的导航堆栈为空时按下后退按钮时,根据正在运行的 Android 版本,其行为如下:

  • Android 11 及更低版本:系统完成 Activity 。
  • Android 12 及更高版本:

  • 系统将 Activity 及其任务移至后台,而不是完成 Activity 。当使用主页按钮或手势导航出应用程序时,此行为与默认系统行为相匹配。
    在大多数情况下,这种行为意味着用户可以更快地从热状态恢复您的应用,而不必从冷状态完全重启应用......
    来源: Back press behavior for root launcher activities .
    在您的情况下,当您按下主屏幕上的后退按钮时,Android 会完成 Activity ,如果您想确认,请在 AppShell.cs 上设置断点构造函数或 MainActivity.cs/OnCreate()你会注意到:
  • 在主屏幕上按下 Home 按钮并从 android 应用程序堆栈恢复应用程序:由于保留了应用程序 Activity ,因此不会命中任何断点。实际上Android会调用MainActivity.OnResume() .
  • 按下后退按钮您将遇到断点,因为 Activity 已终止并且您正在重新开始。

  • 一些潜在的解决方案
  • 在本地数据库(SQLite)或文件上保存并保存日志状态的更新记录,在应用程序启动时读取此 bool 值并相应地显示或不显示登录页面(设置主页)。
  • 如果您不希望您的应用在单击返回按钮时退出,请覆盖 OnBackPressed()在您的 MainActivity使用空代码:
  • public override void OnBackPressed()
    {
    }
  • 将您的应用程序放到后面(暂停)而不是终止它:
  •    public override void OnBackPressed() => MoveTaskToBack(true);
    更多关于 OnBackPressed()
    相关问题
  • What happens when back button or home or application removed from recent apps
  • How can you restrict/control the navigation routes the user can visit based on login status/role?
  • 关于android - 如何设置导航堆栈的根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70470989/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com