Android_Jetpack:NavigationUI的使用——以ActionBar为例

本文介绍了如何在Android应用中使用Jetpack NavigationUI组件,以ActionBar为例,详细阐述了如何实现在MainFragment和SecondFragment之间的跳转,并处理返回操作。通过创建menu资源文件,配置NavigationGraph,设置菜单监听及跳转逻辑,实现了点击ActionBar按钮在Fragment间切换。同时,通过覆盖SecondFragment的onCreateOptionsMenu()方法来清除旧菜单,并利用NavController监听页面变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NavigationUI对3种类型的App bar提供了支持,分别是ActionBar、Toolbar和CollapstingToolbarLayout。另外,除了最常见的menu菜单,NavigationUI还可以配合App bar左侧的抽屉菜单(DrawLayout+NavigationView)和底部菜单(BottomNavigationView)。

现在需要实现以下功能:有MainFragment和SecondFragment,这两个Fragment同属于NavigationTestMainActivity。在MainFragment的ActionBar有一个按钮,点击按钮跳转到SecondFragment,之后点击SecondFragment的ActionBar上的返回按钮,返回到MainFragment。

修改Android_Jetpack:Navigation初见以及使用safe args插件传递参数项目中的代码。
首先在res目录下添加menu目录,之后新建menu_main_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@id/secondFragment"
        android:title="跳转到Second"
        android:icon="@drawable/ic_launcher_foreground"/>
</menu>

这里需要注意的是,android:id要与nav_graph导航图中SecondFragment的id要一致,因为当这个item被点击时,将会跳转到id所对应的Fragment。

在这里插入图片描述
在NavigationTestMainActivity中实例化这个菜单。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main_fragment,menu)
    return true
}

接下来编写相应点击事件的代码。由于引入了NavigationUI,省去了判断被单击菜单项的步骤,可以直接编写跳转代码。

class NavigationTestMainActivity : AppCompatActivity() {
    lateinit var appBarConfiguration: AppBarConfiguration
    lateinit var navController: NavController
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation_test_main)
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)
        appBarConfiguration = AppBarConfiguration(navController.graph)
        //将App bae和NavController绑定
        NavigationUI.setupActionBarWithNavController(this,navController,appBarConfiguration)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main_fragment,menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return NavigationUI.onNavDestinationSelected(item,navController)||
                super.onOptionsItemSelected(item)
    }
    //onSupportNavigateUp可以使用toolbar的后退按钮后退,覆盖此方法,当在SecondFragment中点击ActionBar
    // 返回按钮时,NavigationUI主动使SecondFragment返回到MainFragment
    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController,appBarConfiguration)||
                super.onSupportNavigateUp()
    }
}

由于ActionBar是在NavigationTestMainActivity中进行管理的,所以在跳转到SecondFragment时,需要覆盖SecondFragment的onCreateOptionsMenu()方法,清除MainFragment中对应的menu。

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    menu.clear()//清除menu
    super.onCreateOptionsMenu(menu, inflater)
}

别忘了在onCreate方法中添加

setHasOptionsMenu(true)

使菜单生效。

另外,NavController提供了一个名为addOnDestinationChangedListener的接口,可以对页面切换事件进行监听,代码如下:

navController.addOnDestinationChangedListener { controller, destination, arguments ->
    //收到切换事件
    Log.d("listener","$controller\n$destination\n$arguments")
}

切换页面观察Log
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值