我正在构建一个应用程序,它第一次打开fragment1以获取用户详细信息,一旦用户转发到下一个fragment2,我将保存详细信息,并在SharedPreferences
中将布尔变量isUserRegistered
设置为true,这样当用户下次打开应用程序时,他/她将直接被带到fragment2。我正在使用导航图来处理这些事情。
以下是代码:
//declared at the top in onCreateView() of fragment
val prefs = appContext!!.getSharedPreferences("expense_prefs", Context.MODE_PRIVATE)
一旦用户单击"继续"按钮,将定义以下操作(仅显示相关代码(
val editor = prefs.edit()
editor.putBoolean("isUserRegistered", true)
editor.apply()
findNavController().navigate(R.id.action_getStartedFragment_to_homeFragment)
为了在用户下次访问应用程序时重定向,我编写了以下代码:
//in the same onCreateView() of fragment1
val isUserRegistered = prefs.getBoolean("isUserRegistered", false)
if (isUserRegistered)
findNavController().navigate(R.id.action_getStartedFragment_to_homeFragment)
下面是我的导航文件,我还在其中的两个导航中都添加了CCD_ 3。
<?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/navigation"
app:startDestination="@id/getStartedFragment">
<fragment
android:id="@+id/getStartedFragment"
android:name="net.softglobe.expensemanager.GetStartedFragment"
android:label="fragment_get_started"
tools:layout="@layout/fragment_get_started" >
<action
android:id="@+id/action_getStartedFragment_to_homeFragment"
app:destination="@id/homeFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/homeFragment"
android:name="net.softglobe.expensemanager.HomeFragment"
android:label="fragment_home"
tools:layout="@layout/fragment_home" >
<action
android:id="@+id/action_homeFragment_to_getStartedFragment2"
app:destination="@id/getStartedFragment"
app:popUpToInclusive="true" />
</fragment>
</navigation>
尽管如此,当用户从fragment1导航到fragment2时,前一个片段不会弹出。当用户从fragment2按下后退按钮时,编译器将再次访问fragment1,并且由于导航代码段(如上所示(,它将用户导航到fragment2,因为isUserRegistered
为true。我该如何解决这个问题?
看看这篇文章
要在从一个目的地导航到另一个目的时弹出目的地,请在关联元素中添加app:popUpTo属性。app:popUpTo告诉导航库从后堆栈中弹出一些目的地,作为对导航((调用的一部分。属性值是应该保留在堆栈中的最新目标的ID。
您还可以包括应用程序:popUpToInclusive=";真";以表明应用程序中指定的目标:popUpTo也应从后堆栈。
您没有将所需的片段提供到应该弹出的位置,比如app:popUpTo="@id/getStartedFragment"