多个导航图应用 popbackstack 不起作用
Multiple navigation graph app popbackstack does not work
我目前正在开发一个使用 android 导航组件的应用程序。
该应用程序具有多个导航图,可满足应用程序中不同导航的需求。
用户登录应用,该应用使用底部导航,底部导航栏有 5 个导航图。
然后,用户可以从设置选项卡中注销应用程序。但是,当我按下后退按钮时,我将返回到设置屏幕。
设置导航图如下所示:
<?xml version="1.0" encoding="utf-8"?>
<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/settings_graph"
app:startDestination="@id/settingsFragment">
<fragment
android:id="@+id/settingsFragment"
android:name="zw.myexample.ui.SettingsFragment"
tools:layout="@layout/settings_data">
<action
android:id="@+id/action_settingsFragment_to_loginActivity"
app:destination="@id/toLoginActivity"
app:popUpTo="@id/login_navigation"
app:popUpToInclusive="true"/>
</fragment>
<activity
android:id="@+id/toLoginActivity"
android:name="zw.myexample.ui.LoginActivity"
tools:layout="@layout/activity_login" />
</navigation>
在我的注销功能中,我有以下内容:
findNavController().navigate(R.id.action_settingsFragment_to_loginActivity)
findNavController().popBackStack()
这似乎不起作用,我已经尝试了下面列表中的多个建议:
我发现您正在从一个 activity(包含 setting_fragment)转移到另一个 activity(包含登录片段)。在这种情况下,您可以在使用新任务清除顶部后开始您的 login_activity。
我创建了这个你可以使用的扩展函数:
fun <T : AppCompatActivity> Fragment.gotoActivityWithNoBackUp(targetActivityClass: Class<T>) {
val intent = Intent(requireActivity(), targetActivityClass)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
requireActivity().finish()
startActivity(intent)
}
然后在您的注销按钮中单击,复制此代码:
gotoActivityWithNoBackUp(LoginActivity::class.java)
我目前正在开发一个使用 android 导航组件的应用程序。 该应用程序具有多个导航图,可满足应用程序中不同导航的需求。
用户登录应用,该应用使用底部导航,底部导航栏有 5 个导航图。
然后,用户可以从设置选项卡中注销应用程序。但是,当我按下后退按钮时,我将返回到设置屏幕。
设置导航图如下所示:
<?xml version="1.0" encoding="utf-8"?>
<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/settings_graph"
app:startDestination="@id/settingsFragment">
<fragment
android:id="@+id/settingsFragment"
android:name="zw.myexample.ui.SettingsFragment"
tools:layout="@layout/settings_data">
<action
android:id="@+id/action_settingsFragment_to_loginActivity"
app:destination="@id/toLoginActivity"
app:popUpTo="@id/login_navigation"
app:popUpToInclusive="true"/>
</fragment>
<activity
android:id="@+id/toLoginActivity"
android:name="zw.myexample.ui.LoginActivity"
tools:layout="@layout/activity_login" />
</navigation>
在我的注销功能中,我有以下内容:
findNavController().navigate(R.id.action_settingsFragment_to_loginActivity)
findNavController().popBackStack()
这似乎不起作用,我已经尝试了下面列表中的多个建议:
我发现您正在从一个 activity(包含 setting_fragment)转移到另一个 activity(包含登录片段)。在这种情况下,您可以在使用新任务清除顶部后开始您的 login_activity。
我创建了这个你可以使用的扩展函数:
fun <T : AppCompatActivity> Fragment.gotoActivityWithNoBackUp(targetActivityClass: Class<T>) {
val intent = Intent(requireActivity(), targetActivityClass)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
requireActivity().finish()
startActivity(intent)
}
然后在您的注销按钮中单击,复制此代码:
gotoActivityWithNoBackUp(LoginActivity::class.java)