我有一个带有导航图的活动。导航图有起始目的地:
app:startDestination="@id/loginFragment"
当活动开始不显示登录片段而是跳转到connectFragment时,我遇到了一些情况。所以我是这样实现的:
val jumpToConnection = intent.getBooleanExtra("CONNECTION",false)
if (jumpToConnection) {
findNavController(this, R.id.navHostFragmentLogin).navigate(R.id.connectFragment)
findNavController(this, R.id.navHostFragmentLogin).popBackStack(R.id.connectFragment,false)
}
它按预期跳转到connectFragment,但是当单击返回时它仍然转到loginFragment。虽然我清除了堆栈中的所有内容。
答案 0 :(得分:0)
您可以尝试以下想法:根据您的逻辑设置 startDestination:
这是 nav_graph_login.xml
<?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/nav_graph_login"
app:startDestination="@id/welcomeFragment">
<fragment
android:id="@+id/connectFragment"
android:name="......">
<action
android:id="@+id/action_connectFragment_to_loginFragment"
app:destination="@id/loginFragment"/>
</fragment>
<fragment
android:id="@+id/loginFragment">
</fragment>
</navigation>
这是登录活动xml:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/fragment_login_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true">
</fragment>
最后,您应该设置导航图的起始目的地的登录活动类:
class LoginActivity : AppCompatActivity() {
......
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val jumpToConnection = intent.getBooleanExtra("CONNECTION",false)
initNavigationConfiguration(jumpToConnection)
}
private fun initNavigationConfiguration(jumpToConnection: Boolean){
val fragment : Fragment? = supportFragmentManager.findFragmentById(R.id.fragment_login_container)
if(fragment != null){
val navHostFragment = fragment as NavHostFragment
val graphInflater = fragment.navController.navInflater
val navGraph = graphInflater.inflate(R.navigation.nav_graph_login)
val navController = navHostFragment.navController
val destination = if (jumpToConnection) R.id.connectFragment else R.id.loginFragment
navGraph.startDestination = destination
navController.graph = navGraph
}
}
}
答案 1 :(得分:0)
尝试导航时,不要传递片段目的地,只需使用动作。
例如,在您的 nav_graph 中,将 action 从 loginFragment 添加到 connectFragment 并添加 popUpToInclusive = true。
<fragment
android:id="@+id/loginFragment"
tools:layout="@layout/loginFragment"
android:name="packagename.LoginFragment"
android:label="LoginFragment">
<action
app:popUpToInclusive="true"
android:id="@+id/action_loginFragment_to_connectFragment"
app:destination="@id/connectFragment" />
</fragment>
答案 2 :(得分:0)
它按预期跳转到connectFragment,但是当单击返回时它仍然转到loginFragment。虽然我清除了堆栈中的所有内容。
所以你的目标不是回到 LoginFragment,对吧?
在您的导航资源文件(设计视图)中,单击操作行,并将 LoginFragment 添加到 popUpTo
字段,并选中“包含”选项。