【发布时间】:2019-09-19 19:23:55
【问题描述】:
我是 Android Jetpack Navigation 架构的新手。我正在一个新的应用程序上尝试它。有一个活动和一些片段,其中两个是登录屏幕和电子邮件登录屏幕。我在导航 XML 中定义了这些片段。应用流程如下:
Login screen → Email Login screen
我想要的是,在导航到电子邮件登录屏幕后,当我按下返回时,应用程序退出。这意味着登录屏幕的后台堆栈被删除。我知道登录屏幕不应该以这种方式工作,但我仍然只是想办法解决问题。
我遵循了来自 Google 的 Get started with the Navigation component 的文档。它说,使用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 问题之后,我发现这些属性应该会从后台堆栈中删除我的登录屏幕。但他们没有。该按钮确实导航到电子邮件登录屏幕,但是当我按下返回时,它仍然返回登录屏幕而不是退出应用程序。我错过了什么?
【问题讨论】:
-
记录在案。 Documentation says 可以像使用登录片段一样使用登录片段。我不明白为什么“登录屏幕不应该那样工作”
-
@PanosGr 你指的是 “例如,如果你的应用有一个初始登录流程,一旦用户登录,你应该从后退堆栈,以便“后退”按钮不会将用户带回登录流程”?好吧,就我而言,用户尚未登录。它只是打开一个不同的登录方法。通常,应允许用户返回主登录屏幕并选择不同的登录方式。
标签: android kotlin navigation android-jetpack fragment-backstack