今天做项目的时候, 领导想要一个类似于QQ中的设置的界面, 就是那种使用圆角边框做背景的显示效果。 如下:
每个条目点击之后会显示不同的颜色, 如下:
这种效果其实实现起来很简单, 圆角边框使用shape图形做背景。 条目点下去显示不同颜色的效果使用背景选择器selector。 shape和selector都是android中的图像元素。 我使用shape图形设置了圆角, 并做为背景, 设计出了如下的简单界面:
上图中上下两部分和中间的分割线都放在一个垂直方向的线性布局中, 这个线性布局使用一个圆角的shape做背景。 上下两个条目都是一个RelativeLayout 。
下一步就是为每个条目设置背景选择器selector , 以使点击条目时显示蓝色做为背景。 我为上图中的第一个条目写的背景选择器round_corner_top_item_bg.xml如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:state_focused="false"> <shape> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp"/> <solid android:color="#257AC1" /> <stroke android:width="0dp"/> </shape> </item> <item > <shape> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp"/> <solid android:color="#FFFFFF" /> <stroke android:width="0dp"/> </shape> </item> </selector>
然后为第一个条目设置背景:
android:background="@drawable/round_corner_top_item_bg"
本来以为超级简单, 但是在测试程序时, 这个selector无论如何也没有任何效果!!!将这个selector文件检查了很多遍, 没发现什么错误。 这让我很抓狂啊。 然后想到是不是因为是为ViewGroup设置的selector而不是为单一的控件设置的selector。 所以, 我在布局中加入了一个Button, 然后把这个selector设置到Button上, 它是有效果的。 难道ViewGroup不能使用selector吗? 在网上搜了半天, 也没有找到答案。
所以决定先写代码逻辑, 在代码中为这个条目设置点击监听:
titleLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("xxx", "click title"); } }) ;
这时候奇怪的事情发生了! selector竟然有效果了!
真是让人无语啊。 搞了半天, 也不知道什么原因。
所以。 如果为一个ViewGroup设置了Selector, 但是没有效果, 那么在代码中为这个ViewGroup先设置OnClick事件, 可能就会解决这个问题!
到此为止, 我也没想出来原因。 估计和Android组件的事件传递机制相关。 有知道原因的读者还希望不吝赐教。