导航popUpTo和PopUpToInclusive不会清除后台堆栈 [英] Navigation popUpTo and PopUpToInclusive aren't clearing the backstack

查看:166
本文介绍了导航popUpTo和PopUpToInclusive不会清除后台堆栈的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Android Jetpack导航体系结构的新手。我正在一款新的应用程序上试用。有一个活动和几个片段,其中两个是登录屏幕和电子邮件登录屏幕。我在我的导航XML中定义了这些片段。APP流程如下:

Login screenEmail Login screen

我想要的是,在导航到电子邮件登录屏幕后,当我按BACK时,应用程序退出。这意味着删除了登录屏幕的后端堆栈。我知道登录屏幕不应该那样工作,但我还在想办法。

我遵循了Google的Get started with the Navigation component中的文档。它说,使用app:popUpToapp:popUpToInclusive="true"应该清除后台堆栈,但是当我在邮件登录屏幕上按BACK时,它仍然返回登录而不是退出。

所以,以下是我尝试过的内容。

nav_main.xml

<fragment android:id="@+id/loginFragment"
          android:name="com.example.myapp.ui.main.LoginFragment"
          android:label="@string/login"
          tools:layout="@layout/fragment_login" >
    
    <action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/emailLoginFragment"
        app:popUpToInclusive="true"/>

</fragment>

<fragment android:id="@+id/emailLoginFragment"
          android:name="com.example.myapp.ui.main.EmailLoginFragment"
          android:label="EmailLoginFragment"
          tools:layout="@layout/fragment_login_email" />

LoginFragment.kt

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding.emailLoginButton.setOnClickListener {
        findNavController().navigate(R.id.action_login_to_emailLoginFragment)
    }
    
    return binding.root
}

我给了一个按钮一个单击事件。在它中,我使用导航控制器导航到电子邮件登录屏幕,为其提供操作ID。在<action>中,有app:popUpToapp:popUpToInclusive="true"

在反复阅读文档以及阅读大量StackOverflow问题之后,我发现这些属性应该可以将我的登录屏幕从后台堆栈中移除。但它们不会。这个按钮确实会导航到电子邮件登录屏幕,但当我按Back时,它仍然会返回登录屏幕,而不是退出应用程序。我错过了什么?

推荐答案

<action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/loginFragment"
        app:popUpToInclusive="true"/>
您的popUpTo将返回到电子邮件登录,然后因为包含它而弹出。 如果您要将popUpTo更改为您的登录片段,它将被导航回并因包含标志而弹出,这将导致您所需的行为。

这篇关于导航popUpTo和PopUpToInclusive不会清除后台堆栈的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆