最近项目中有很多需求需要修改背景色,简单来说就是通过点击listview条目,把选中的item改变颜色。而色值则通过color.xml文件获取。大概需求如下,布局分两部分,第一部分是横向的LinearLayout,第二部分是一个listview,当点击条目的时候,需要让头部和item一起变颜色。
<resources>
<color name = "yellow">#ffff00<color>
<color name = "white">#ffffff<color>
resources>
具体的点击条目怎么实现变色的逻辑在这里就不写了,主要讲一下写代码的时候遇到的问题。
因为条目是固定的,只有7个,所以在getview()这个方法中,判断点击的条目位置和getview(View arg1 , int position)方法中position的位置进行对比,点击条目的位置是通过方法传进来的,如下判断:
if(item_position == 0 && position == 0){
//说明是第一个条目,改变第一个条目颜色,其他不变
arg1.setBackgroundResource(R.color.yellow);
frist_root.setBackgroundResource(R.color.yellow);
second_root.setBackgroundResource(R.color.white);
//下面是第三个、第四个等等
......
} else if(item_position == 1 && position == 1){
arg1.setBackgroundResource(R.color.yellow);
frist_root.setBackgroundResource(R.color.white);
second_root.setBackgroundResource(R.color.yellow);
........
} ......
好了,run一把。大功已成,等等。。。。。。。。。
第一次点击,效果nice,我从第一个条目点到第二个条目,在切到第三个条目,一切都OK,我很happy,然后我回切到第一个条目,效果如图:
大写的懵逼ing。。。。。。
我再切回来,头部布局没有跟着变颜色。我开始的设想是,没有走getview方法中的frist_root.setBackgroundResource(R.color.yellow)代码。然而我debug以后…….发现这行代码是走了的,但是为毛没变颜色呢???
然后就去问我们老大,一个集智慧与经验并存的猿!他懵逼了不到5分钟,说来来来,这样搞一搞。于是就有了如下这段代码:
if(item_position == 0 && position == 0){
//说明是第一个条目,改变第一个条目颜色,其他不变
arg1.setBackgroundResource(R.color.yellow);
frist_root.setBackgroundColor(context.getResource().getColor(R.color.yellow));
second_root.setBackgroundColor(context.getResourcr().getColor(R.color.white));
//下面是第三个、第四个等等
......
} else if(item_position == 1 && position == 1){
arg1.setBackgroundResource(R.color.yellow);
frist_root.setBackgroundColor(context.getResource().getColor(R.color.white));
second_root.setBackgroundColor(context.getResource().getColor(R.color.yellow);
........
} ......
然后就没有然后了,效果就这么实现了。。。。。我搞了半天被别人不到5分钟搞定了,憋到内伤。。。。
总结一下:setBackgroundResource(R.color.XXX)改变的颜色是最下层的颜色,当改变完颜色以后,因为我头部布局在xml文件中默认颜色是white,所以又给white遮盖掉了。
xml 文件中布局默认的颜色呢,可以理解为显示在中层。当我用Resource这个方法,把颜色改变过来以后,它因为在最下层,所以直接被中层的给刷掉了,因此颜色又变了回去。
而setBackgroundColor(context.getResouce().getColor(R.color.XXX))呢,可以理解为改变的是最上层的颜色,不管我xml布局中的颜色是什么色,我在你布局颜色上层又给刷了回去。所以就显色了。
当然,这只是鄙人想当然,要想深入理解原理,还是要看源码的,我只是为了方便记忆自己理解一下。但不管怎么理解,最主要是功能实现了。而且以后,在遇到改变背景色,可以先考虑使用最后一个方法。
有不当之处,末学虚心接受,还望各位前辈多多批评。。。。。。