Fragment之间切换与回退
上一节讲述了如何使用Navigation创建一个Fragment并进行展示,本节内容讲述如何使用Navigation对Fragment进行切换。
在上一节创建了三个Fragment,每个Fragment页面有一个按钮,这里要实现的功能是第一个页面跳转至第二个页面,第二个页面跳转至第三个页面,第三个页面返回至第一个页面。相关代码如下:
跳转页面:
findNavController().navigate(@IdRes int resId)
返回页面:
findNavController().popBackStack(@IdRes int destinationId, boolean inclusive)
findNavController().popBackStack()
注意:
-
resId
和destinationId
表示的id是<navigation>
标签中<fragment>
定义的id -
inclusive
为true时表示回退到destinationId
目标的Fragment后并将该Fragment移除回退栈,所以后面当再次跳转至该页面执行该方法时,将无法再次回退至该以destinationId
为目标的Fragment,但是可以用navigate(@IdRes int resId)
进行跳转。(该功能可以用来做启动页到主页的功能) -
findNavController().popBackStack()
表示回退至上个页面 -
在activity获取
NavController()
的方式有两种,如下
第一种:
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
setupActionBarWithNavController(navController)//可以将导航器 navController 与 Toolbar/ActionBar 绑定。但是, 如果Activity 使用了Toolbar, 就需要将其使用的Theme设置为noActionBar:
这些代码表示根据目的地的标签,在应用栏中显示标题;只要您不在顶级目的地,就会显示向上按钮。
根据目的地的标签,在应用栏中显示标题;只要您不在顶级目的地,就会显示向上按钮。
另外需要重写onSupportNavigateUp()
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp() || super.onSupportNavigateUp()
}
//onSupportNavigateUp()方法的重写,意味着Activity将它的 back键点击事件的委托出去,如果当
//前并非栈中顶部的Fragment, 那么点击back键,返回上一个Fragment
第二种:
使用Navigation
的ktx拓展函数
引入依赖:
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
findNavController(R.id.main_content)
//这个id使用被定义为NavHost的布局
将上一节的代码经过改动后如下所示:
MainPage1Fragment.kt
class MainPage1Fragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.fragment_item1, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
go.setOnClickListener {
findNavController().navigate(R.id.mainPage2Fragment)
}
}
}
MainPage2Fragment.kt
class MainPage2Fragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.fragment_item2, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
go.setOnClickListener {
findNavController().navigate(R.id.mainPage3Fragment)
}
}
}
MainPage3Fragment.kt
class MainPage3Fragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.fragment_item3, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
go.setOnClickListener {
findNavController().popBackStack(R.id.mainPage1Fragment,true)
}
}
}
布局文件没有改变,所以不再给出。
参考链接
- basic-android-kotlin-training-fragments-navigation-component:https://developer.android.google.cn/codelabs/basic-android-kotlin-training-fragments-navigation-component?continue=https%3A%2F%2Fdeveloper.android.google.cn%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-3-pathway-2%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-fragments-navigation-component#7