Kotlin编程:根据导航抽屉选择动态修改AppBarLayout背景色
解决导航抽屉切换时修改AppBarLayout背景色的问题
嗨,作为Android新手能动手尝试修改UI逻辑已经超棒啦!我来帮你搞定这个问题——既要正确修改AppBarLayout的背景色,还要解决之前Toolbar颜色变成深灰色的小bug~
先搞清楚为什么Toolbar会变成深灰色
大概率是你引用颜色的方式不对:
- 要么是你用的
R.color.xxx对应的颜色本身就是深灰色,先去res/values/colors.xml里确认一下颜色值; - 要么是误用了主题里的默认属性(比如
?attr/colorPrimaryDark),或者用了过时的getResources().getColor()方法,导致颜色解析出错。
正确修改AppBarLayout背景色的步骤
1. 先定义好需要的颜色
打开res/values/colors.xml,添加你需要的导航项对应颜色:
<resources> <!-- 其他已有颜色 --> <color name="nav_color_au">#E53935</color> <color name="nav_color_home">#1E88E5</color> <color name="nav_color_settings">#43A047</color> </resources>
2. 获取AppBarLayout实例
在你的Activity里,先拿到AppBarLayout的引用。如果用传统的findViewById:
// 可以在onCreate里初始化,或者在导航选择事件里临时获取 val appBarLayout = findViewById<AppBarLayout>(R.id.app_bar_layout)
注意:把
R.id.app_bar_layout换成你布局文件里AppBarLayout的实际ID哦!
如果是用更推荐的ViewBinding(新手可以慢慢学这个,比findViewById更省心):
private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 之后直接用binding.appBarLayout就能拿到实例啦 }
3. 在导航抽屉选择事件里设置颜色
找到你处理导航项点击的onNavigationItemSelected方法,修改成这样:
override fun onNavigationItemSelected(item: MenuItem): Boolean { // 这里用findViewById或者ViewBinding获取实例都可以 val appBarLayout = findViewById<AppBarLayout>(R.id.app_bar_layout) when (item.itemId) { R.id.nav_au -> { // 用ContextCompat.getColor处理版本兼容,确保颜色正确显示 appBarLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.nav_color_au)) // 如果需要同时修改Toolbar颜色,也可以加上这句 // findViewById<Toolbar>(R.id.toolbar).setBackgroundColor(ContextCompat.getColor(this, R.color.nav_color_au)) } R.id.nav_home -> { appBarLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.nav_color_home)) } R.id.nav_settings -> { appBarLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.nav_color_settings)) } // 其他导航项的处理逻辑 } // 别忘了关闭导航抽屉 val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout) drawerLayout.closeDrawer(GravityCompat.START) return true }
为什么要用ContextCompat.getColor?
这个方法会自动处理Android版本的兼容问题,不管你的设备是新是旧,都能正确解析颜色资源,避免出现颜色显示异常的情况(比如你之前遇到的深灰色问题)。
内容的提问来源于stack exchange,提问作者nherrmann




