从第二个片段开始导航的活动

时间:2020-12-23 13:52:06

标签: android kotlin

我有一个带有导航图的活动。导航图有起始目的地:

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。虽然我清除了堆栈中的所有内容。

3 个答案:

答案 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 字段,并选中“包含”选项。

  • “popUpTo”表示弹出这些片段直到到达“xxxFragment”,如果勾选“inclusive”那么这个“xxxFragment”也会弹出。