使用导航组件在不同图形之间导航
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)
我有两个活动,一个包含登录过程的所有片段,另一个包含主应用程序的所有片段。
假设我想从 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)