使用导航组件在不同图形之间导航

Navigate between different graphs with Navigation components

我有两个活动,一个包含登录过程的所有片段,另一个包含主应用程序的所有片段。

假设我想从 Activity1(包含登录的所有导航图)导航到 Activity2(包含主应用程序的所有导航图)

  class LoginActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_login)
        }
    
        fun goToMainActivity(){
            startActivity(Intent(this,MainActivity::class.java))
            finish()
        }
    }

这里我调用方法goToMainActivity()

 class LoginFragment : Fragment() {
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_login,container,false)
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            btn_go.setOnClickListener {
                // call the method goToMainActivity() to kill all fragments contained by that Activity and move foward to MainActivity with another nav_graph
            }
        }
    }

由于 LoginActivity 持有一个 nav_graph 并且是所有 Login Fragments 的导航宿主,现在我想杀死 LoginActivity 包含的所有片段并走向一个新 Activity (MainActivity) 包含不同的导航图

这样做的好方法吗?或者我应该以不同的方式导航?

您可以迁移到单个 Activity 导航。在您的 Nav Graph 添加一个 Action 以在最后一个 LoginFragemnt 和 MainFragment 和 select:

之间导航
Pop Behaviour:
Pop To - Self
Inclusive - YES

这应该会自动为您清除堆栈,然后按返回键将关闭应用程序。

编辑: 或者只是在从 LoginFragment 移动到 MainFragment 的操作下手动将这两行添加到导航 xml 中:

app:popUpTo="@id/loginFragment"
app:popUpToInclusive="true"

您不需要定义第二个 activity,只需将第二个导航图添加到 nav_graph.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"
            app:startDestination="@id/loginFragment">

    <fragment
            android:id="@+id/loginFragment"
            android:name="com.mycompany.loginFragment"
            tools:layout="@layout/fragment_login"
            android:label="Login" >
         <action
                android:id="@+id/action_loginFragment_to_new_graph"
                app:destination="@id/new_graph" />
    </fragment>

    <include app:graph="@navigation/new_graph" />
</navigation>

然后,使用您的 navController,导航操作:

navController.navigate(R.id.action_loginFragment_to_new_graph)