You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动