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

Posted

技术标签:

【中文标题】使用导航组件在不同图形之间导航【英文标题】:Navigate between different graphs with Navigation components 【发布时间】:2020-03-30 10:54:36 【问题描述】:

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

假设我想从 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 并且是所有登录 Fragment 的导航主机,现在我想杀死 LoginActivity 中包含的所有 Fragment 并转向一个拥有不同导航图的新 Activity (MainActivity)

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

【问题讨论】:

【参考方案1】:

您无需定义第二个活动,只需将第二个导航图添加到您的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)

【讨论】:

但是第二个导航图意味着第二个导航活动,对吧? 有什么方法可以从新图转到片段而不是 startDestination? @Emiliano Schiavone 如果您的意思是特定片段,您可以将目标片段添加到当前图表。同一个片段可以通过不同的导航操作留在不同的图表中。 就我而言,我使用了不同的活动,因为我的身份验证相关片段(登录、注册等)没有操作栏,但我的其他片段有。因此,添加 2 个活动帮助我轻松实现不同的工具栏样式。虽然我不确定这是否是一个好方法。 像这样嵌入第二个导航图与嵌入具有另一个导航图的活动并导航到活动之间有区别吗? Android在这里推荐后一种方式:developer.android.com/guide/navigation/navigation-migrate#add【参考方案2】:

您可以迁移到单个活动导航。在您的导航图中添加一个操作以在最后一个 LoginFragemnt 和 MainFragment 之间导航并选择:

Pop Behaviour:
Pop To - Self
Inclusive - YES

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

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

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

【讨论】:

以上是关于使用导航组件在不同图形之间导航的主要内容,如果未能解决你的问题,请参考以下文章

Vue JS 2. 如何防止在两个父级之间导航时重新加载相同的嵌套组件?

在 React.js 中的两个组件之间创建链接 [关闭]

通过导航组件在底部导航片段之间传递数据

Android 导航组件 - 在包含的模块图之间导航

导航架构组件 - 将参数数据传递给startDestination

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)