Android JetPack之Navigation(二)

86 篇文章 36 订阅

Fragment之间切换与回退

上一节讲述了如何使用Navigation创建一个Fragment并进行展示,本节内容讲述如何使用Navigation对Fragment进行切换。

在上一节创建了三个Fragment,每个Fragment页面有一个按钮,这里要实现的功能是第一个页面跳转至第二个页面,第二个页面跳转至第三个页面,第三个页面返回至第一个页面。相关代码如下:

跳转页面:

findNavController().navigate(@IdRes int resId)

返回页面:

findNavController().popBackStack(@IdRes int destinationId, boolean inclusive)
findNavController().popBackStack()

注意:

  1. resIddestinationId表示的id是<navigation>标签中<fragment>定义的id

  2. inclusive为true时表示回退到destinationId目标的Fragment后并将该Fragment移除回退栈,所以后面当再次跳转至该页面执行该方法时,将无法再次回退至该以destinationId为目标的Fragment,但是可以用navigate(@IdRes int resId)进行跳转。(该功能可以用来做启动页到主页的功能)

  3. findNavController().popBackStack()表示回退至上个页面

  4. 在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)
        }
    }
}

布局文件没有改变,所以不再给出。

参考链接

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值