Android之路

导航

Android中EditText样式修改 聚焦光标、背景

  在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的。这两天,在项目中涉及此需求,现记录如下:

  首先,说明灵感来自于http://bbs.csdn.net/topics/391491663中的评论,谢谢!另外,若想了解更多EditText属性,可参考:http://blog.csdn.net/qq_15128547/article/details/50947041

默认情况下:

<EditText                                            
            android:id="@+id/editText"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:gravity="left"
            android:hint="hint"
           />

默认运行效果如下:

观察效果发现,默认情况下,聚焦背景蓝色、光标黑色、选择下方是蓝色图片(即图中的textSelectHandle)

现将上述三项改为自定义,需要下述三个属性:

android:background        背景

android:textCursorDrawable   光标

android:textSelectHandle    聚焦选择图标

设置如下:

<EditText
            android:id="@+id/editText"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:gravity="left"
            android:hint="hint"
            android:background="@drawable/edit_text_bg"
            android:textCursorDrawable="@drawable/edit_cursor"
            android:textSelectHandle="@drawable/edit_select_handle" />

设置后运行效果如下:

下面,分别描述对应样式图片:

edit_text_bg:自定义背景
edit_cursor:光标
edit_select_handle:聚焦选择下方图标

上述三个,均使用自定义drawable,具体代码如下:
edit_text_bg.xml:


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <inset xmlns:android="http://schemas.android.com/apk/res/android"
 3        >
 4     <selector>
 5         <item android:state_enabled="false">
 6             <nine-patch android:src="@drawable/edittext_thin"
 7                 android:tint="@color/n_text_default_color"                            
 8                 />                                                <!--tint:着色器  例:当前edittext_src是黑色的线条,而显示时,由于使用了tint,重新设置了颜色,因此,就会显示设置的线条颜色  -->
 9         </item>
10         <item android:state_pressed="false" android:state_focused="false">
11             <nine-patch android:src="@drawable/edittext_thin"
12                 android:tint="@color/n_text_default_color" />
13         </item>
14         <item>
15             <nine-patch android:src="@drawable/edittext_thin"
16                 android:tint="@color/n_text_focus_color" />
17         </item>
18     </selector>
19 </inset>
View Code

 

 

 

edit_cursor.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    
    <size android:width="2dp" />
    
    <solid android:color="@color/n_text_focus_color" />

</shape>

edit_select_handle.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <size android:width="0dp" />            <!-- 实际不显示,该图片的作用仅是占位,因直接设置android:textSelectHandle="@null"运行时出错,当然根据具体情况,可设置成一张图片png等 -->

</shape>

整个修改涉及的代码如上,但需要注意一下事项:

1、若是仅某个EditText需要使用特殊样式则直接在当前EditText中设置属性即可;但为了可扩展性,建议写在styles.xml中,以后在需要的EditText中引用该样式即可,即:

<EditText
...
style="@style/EditTextStyle"
...
/>

 

2、若整个项目均统一风格,则在AndroidManifest.xml中的<application>标签中,加入android:theme="@style/AppTheme",其中AppTheme中加入以下属性即可:

<style name="AppTheme" parent="@style/AppBaseTheme">
    ...
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    ...
</style>

 

3、关于EditTextStyle的样式如下:

<!-- EditTextStyle  EditText样式设置:背景、光标、选中下方图标 -->  
    <style  name="EditTextStyle" parent="android:Widget.Material.Light.EditText">       
       <item name="android:background">@drawable/edit_text_bg</item>
       <item name="android:textCursorDrawable">@drawable/edit_cursor</item>
       <item name="android:textSelectHandle">@drawable/edit_select_handle</item>
    </style >   

<!-- 关于上述的parent="android:Widget.Material.Light.EditText",需要根据自己当前主题Theme设置 ;其实也没多大差别,查看源码发现最终的都是parent="Widget.EditText" -->

--------------------------补充以下,另外一张图,选择文本时,出现的图标:

android同样提供了相应的属性,在此不再赘述:

android:textSelectHandleLeft="@drawable/edit_select_left"      //
android:textSelectHandleRight="@drawable/edit_select_right"     //
View Code

 

疑问:在写代码时,用到hint,但是,起初运行时,并未显示 ,多次修改也不行,最后,很之前的一个界面对比,发现当前Activity没有设置Theme,于是就设置了系统的Theme,结果就可以了,不知道问什么?知道的小伙伴,麻烦告知:

<style name="AppBaseTheme" parent="android:Theme.Light">       
    </style>

    <style name="AppTheme" parent="@style/AppBaseTheme"></style>

此文仅是抛砖引玉,关于EditText属性还很多,大家可以测试,有什么问题,欢迎交流!

posted on 2016-08-17 17:32  Android之路  阅读(15579)  评论(0编辑  收藏  举报