android - 导航图中身份验证后如何清除片段?
问题描述
我正在使用导航图,其中我有两个片段(登录片段和主片段),登录片段用于对用户进行身份验证,主片段正在显示数据列表。成功验证后,我可以导航到主片段但是当我点击后退按钮,应用程序既没有关闭也无法导航回登录片段。这是我的导航图代码
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/authenticationScreen">
<fragment
android:id="@+id/authenticationScreen"
android:name="com.example.grocer.authentication.AuthenticationScreen"
android:label="AuthenticationScreen" >
<action
android:id="@+id/action_authenticationScreen_to_mainFragment"
app:destination="@id/mainFragment" />
</fragment>
<fragment
android:id="@+id/mainFragment"
android:name="com.example.grocer.mainscreen.MainFragment"
android:label="MainFragment" >
<action
android:id="@+id/action_mainFragment_to_choiceSelectedFragmentModel"
app:destination="@id/choiceSelectedFragmentModel" />
</fragment>
成功认证后,我希望用户导航到主片段。因此,如果用户单击后退按钮,应用程序将关闭,而不会导航回登录片段。这是我的登录片段代码
class AuthenticationScreen : Fragment(){
private fun signIn() {
val signInIntent = mGoogleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_SIGN_IN) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
val account = task.getResult(ApiException::class.java)
firebaseAuthWithGoogle(account!!)
} catch (e: ApiException) {
showShortToast(e.message!!)
}
}
}
private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
mAuth.signInWithCredential(credential)
.addOnCompleteListener{
if(it.isSuccessful){
updateUI()
showShortToast("success")
}else{
showShortToast("failed")
}
}
}
override fun onStart() {
super.onStart()
if(mAuth.currentUser == null){
}else{
updateUI()
}
}
private fun updateUI(){
findNavController().navigate(R.id.action_authenticationScreen_to_mainFragment)
}
}
我应该如何解决这个问题?谁能告诉我?
解决方案
在您的nav_graph的authenticationScreen中,将这些行添加到操作中:
app:popUpTo="@id/authenticationScreen"
app:popUpToInclusive="true"
app:popUpTo="@id/authenticationScreen"指定我们将回到这个片段
app:popUpToInclusive="true"指定这个片段将被弹出,因此应用程序将关闭,因为当我们单击后退按钮时将无处可去。
您在 nav_graph 中的 loginFragment 应如下所示:
<fragment
android:id="@+id/authenticationScreen"
android:name="com.example.grocer.authentication.AuthenticationScreen"
android:label="AuthenticationScreen" >
<action
android:id="@+id/action_authenticationScreen_to_mainFragment"
app:destination="@id/mainFragment"
app:popUpTo="@id/authenticationScreen"
app:popUpToInclusive="true"/>
</fragment>
推荐阅读
- html - 垂直堆叠元素(固定大小)
- delphi - Delphi - 如何从 mdi 应用程序中的子窗口访问表单
- c++ - 如何通过引用传递位域
- android - Android Account Transfer API:在哪里获取 AccountTransferClient.sendData(accountType, transferData) 的 transferData?
- amazon-web-services - 如何使用 Cloudformation 为 API 网关启用 Cloudwatch 日志?
- css - 使用 Live Sass Compiler 完全改变了网站并且无法恢复到常规 CSS?
- database - Redis主从问题
- keras - CNN 文本分类预测用于排名的标签
- mysql - mysql 数据库服务器中的内存泄漏
- c++ - ANTLR4 CPP14 语法无法识别十进制数