Android中setBackgroundDrawable()传对象崩溃,用匿名类却正常的原因
ActionBar颜色修改代码异常问题原因说明
第一段代码崩溃的核心原因
崩溃和你是否提前声明ColorDrawable变量没有关系,问题出在色值字符串格式上:
- 你第一次写代码时,传入
Color.parseColor()的参数是" #070b2e",色值字符串的#号前多了一个前置空格。parseColor方法不识别带非法空格的色值格式,会直接抛出参数非法异常,导致应用崩溃。
匿名实例写法正常运行的原因
你调整为匿名创建ColorDrawable实例的写法时,无意修正了色值字符串的格式错误:
- 这段代码里传入的色值是
"#070b2e",开头没有多余空格,parseColor可以正常解析出对应颜色值,所以代码能正常运行、ActionBar颜色也能修改成功。这个运行差异和变量声明方式无关,纯粹是改写法时顺手修复了色值格式问题。
空指针警告一直存在的原因
IDE提示的Method invocation 'setBackgroundDrawable' may produce 'NullPointerException'警告,和上述色值解析问题是两个独立的问题:
getSupportActionBar()方法不是必然返回ActionBar实例,如果当前Activity使用了NoActionBar主题、或者代码中主动隐藏了ActionBar,这个方法会返回null,直接链式调用返回对象的setBackgroundDrawable方法,就存在空指针风险。- IDE的静态检查只会识别你是否对
getSupportActionBar()的返回值做了非空判断,不会关心你传入方法的参数是提前声明的变量还是匿名实例,所以只要你保持链式调用的写法,不管参数怎么写,这个警告都会一直存在。
推荐的安全写法
// 先获取ActionBar实例做非空判断,避免空指针 ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { // 色值字符串不要带多余空格、特殊字符 ColorDrawable drawable = new ColorDrawable(Color.parseColor("#070b2e")); actionBar.setBackgroundDrawable(drawable); }
内容的提问来源于stack exchange,提问作者Dhaval Gosai
相关产品推荐
相关产品推荐

