我对Android Jetpack Navigation架构还不熟悉,正在尝试在新应用上使用。该应用只有一个活动和几个片段,其中两个是登录屏幕和电子邮件登录屏幕。我在我的导航XML中定义了这些片段。应用程序的流程如下:
登录屏幕
→ 电子邮件登录屏幕
我想要的是,在导航到电子邮件登录屏幕后,当我按返回键时,应用程序退出。也就是说,登录屏幕的后退堆栈被移除。我知道登录屏幕不应该这样工作,但我还在摸索中。
我遵循了Google的开始使用导航组件文档。它说,使用app:popUpTo
和app:popUpToInclusive="true"
可以清除后退堆栈,但是当我在电子邮件登录屏幕上按返回键时,它仍然回到登录屏幕而没有退出应用程序。
所以,这是我尝试过的。
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:popUpTo
和 app:popUpToInclusive="true"
。
反复阅读文档以及阅读大量 StackOverflow 问题后,我发现这些属性应该将我的登录屏幕从后堆栈中移除。但是它们没有起到作用。按钮确实导航到电子邮件登录屏幕,但当我按返回键时,它仍然返回到登录屏幕而不是退出应用程序。我漏掉了什么?