标签:表示 parent 不能 ant 作用 edit set 通知栏 方案
引言
上一篇Android UI中文章我们详细介绍了Android中shape标签的使用。通过shape标签我们可以定义矩形、椭圆、环形、直线等效果。不过shape只能定义单一的形状,在实际开发中,我们经常需要有一些交互性的体验。例如,按钮按下时的效果,ListView中Item被选中时的样式。这些固然可以通过写Java逻辑代码来实现,但是Android系统为我们定义了selector标签来实现这些功能。这样一方面我们少写了些Java代码,同时selector定义在XML文件中,可维护性相比写在Java代码中也要好一点。下面就来介绍这个selector吧。
selector标签的介绍
selector标签,可以添加一个或多个item子标签,而相应的状态是在item标签中定义的。定义的xml文件可以作为两种资源使用:drawable和color。作为drawable资源使用时,一般和shape一样放于drawable目录下,item必须指定android:drawable属性;作为color资源使用时,则放于color目录下,item必须指定android:color属性。
那么,看看都有哪些状态可以设置呢:
下面我们就通过例子来看一下常用的场景。
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 4 <!--按钮按下状态样式--> 5 <item android:state_pressed="true" android:drawable="@drawable/btn_pressed_style" /> 6 <!--控件不可用时 7 设置View.setEnabled方法 8 --> 9 <item android:state_enabled="false" android:drawable="@drawable/btn_enabled_style" /> 10 11 <!--获得焦点时--> 12 <item android:state_focused="true" android:drawable="@drawable/btn_focus_style" /> 13 <!--失去焦点时 14 如果定义android:state_focused="true" 15 没有定义android:state_focused="false" 16 那么EditText失去焦点,就使用默认样式 17 --> 18 <item android:state_focused="false" android:drawable="@drawable/btn_unfocus_style" /> 19 20 <!--默认状态下样式--> 21 <item android:drawable="@drawable/btn_normal_style" /> 22 </selector>
我们看到通过select标签,我们可以省去一些Java逻辑代码的编写(针对样式改变的)。这里有一个注意点:默认样式下item必须定义在最后一个,如果你定义在最前面或者中间会导致默认item以下定义的其他item无效。这也算是一个小坑把。
在对控件进行操作时,如果想对控件的文字(例如:Button、TextView的文字)进行改变时,也可以使用selector来改变。这里给大家看一下代码示例:
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 <!-- 当前窗口失去焦点时 --> 4 <item android:color="@android:color/black" android:state_window_focused="false" /> 5 <!-- 不可用时 --> 6 <item android:color="@android:color/background_light" android:state_enabled="false" /> 7 <!-- 按压时 --> 8 <item android:color="@android:color/holo_blue_light" android:state_pressed="true" /> 9 <!-- 被选中时 --> 10 <item android:color="@android:color/holo_green_dark" android:state_selected="true" /> 11 <!-- 被激活时 --> 12 <item android:color="@android:color/holo_green_light" android:state_activated="true" /> 13 <!-- 默认时 --> 14 <item android:color="@android:color/white" /> 15 </selector>
最后我们在使用时只要这样即可:
1 <Button 2 android:layout_width="match_parent" 3 android:layout_height="50dp" 4 android:text="点击按钮" 5 android:textSize="16sp" 6 android:textColor="@color/text_btn_selector" 7 android:id="@+id/main" 8 android:background="@drawable/button_bg_style"/>
最后的注意点
另外,selector标签下有两个比较有用的属性要说一下,添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,但必须在API Level 11及以上才支持:
最后,关于ListView的ListItem样式,有两种设置方式,一种是在ListView标签里设置android:listSelector属性,另一种是在ListItem的布局layout里设置android:background。但是,这两种设置的结果却有着不同。同时,使用ListView时也有些其他需要注意的地方,总结如下:
当ListItem里有Button或CheckBox之类的控件时,会抢占ListItem本身的焦点,导致ListItem本身的触摸点击事件会无效。那么,要解决此问题,有三种解决方案:
第三种是最方便,也是推荐的方式,它会将ListItem根布局下的所有子控件都设置为不能获取焦点。android:descendantFocusability属性的值有三种,其中,ViewGroup是指设置该属性的View,本例中就是ListItem的根布局:
标签:表示 parent 不能 ant 作用 edit set 通知栏 方案
原文地址:http://www.cnblogs.com/dreamGong/p/6182235.html