最近一个项目效果,输入框只保留底部下划线,并可以根据是否获取到焦点变色。首先想到了自定义View。但是感觉为这么个小功能,有点大材小用。查了一下资料,发现使用自定义背景样式就可以简单的实现。特此记录。
首先,需要绘制绘制一个Edittext的背景边框。填充色设置为透明
<shape android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
<!--设置边框宽度和颜色 -->
<stroke
android:width="1dp"
android:color="@android:color/holo_blue_bright" />
</shape>
但是这是一个有四个边框的方形图片。需要把左、上、右的边框去掉。方法很简单,就是设置边框的边距。将边距设置为 负数,就看不到了。
完整代码如下:
第一步、设置 没有焦点时的边框
unfocus_bg.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 给边框 设置编边距 将边框的左、上、右 设置为负数,会将边框移除屏幕 ,只能看到底部的下划线 -->
<item
android:left="-10px"
android:right="-10px"
android:top="-10px">
<!-- 绘制一个方形边框,填充色设置为透明 -->
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<!--设置边框的宽度和颜色 -->
<stroke
android:width="1dp"
android:color="@android:color/holo_red_light" />
<!-- 如果感觉字体距离底部或者左边太近,可以设置 padding属性 拉开距离 -->
<padding
android:bottom="5px"
android:left="10px"/>
<solid android:color="@android:color/transparent" />
</shape>
</item>
</layer-list>
第二步、设置 获取焦点时的边框和颜色
focus_bg.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:left="-10px"
android:right="-10px"
android:top="-10px">
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<stroke
android:width="1dp"
android:color="@android:color/holo_red_light" />
<padding
android:bottom="5px"
android:left="10px"/>
<solid android:color="@android:color/transparent" />
</shape>
</item>
</layer-list>
第三步、设置背景选择器,根据有无焦点,显示不同的背景
edit_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_focused="true" android:drawable="@drawable/focus_bg"></item>
<item android:drawable="@drawable/unfocus_bg"></item>
</selector>
最后 使用:
<EditText
android:id="@+id/et"
android:background="@drawable/edit_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:hint="底部下划线" />
提示:如果想刚进入页面的时候,Editext 不自动获取焦点,可以在 Editext的父布局添加属性:
android:focusable="true"
android:focusableInTouchMode="true"
具体效果如下:
无焦点时:
获取到焦点时: