【问题标题】: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)

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

【问题讨论】:

    标签: android kotlin navigation android-architecture-navigation


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多