EditText的总结
前言
今天废话不多说,直接开始,毕竟,这个控件,大家都用烂了,那我就复习一下(补课)。Music !!!
首先还是来简单的实现它,我们在xml文件中添加:
<EditText
android:layout_width="match_parent"
android:id="@+id/edittext"
android:layout_height="60dp" />
然后运行应用程序,我们就可以看到这个组件的样子了。
它的监听事件如下:
edittext.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//内容变换之前调用
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//内容变换时调用
}
@Override
public void afterTextChanged(Editable editable) {
//内容变换之后调用
}
});
但是这样光秃秃的很不好看,所以我们可以设置它的其他属性来修改它的样式,常用的有这些
属性 | 说明 | 备注 |
---|---|---|
android:hint="Hello world" | 内容为空时的提示文字 | 实测有效 |
android:textColorHint="@color/red" | 内容为空时的提示文字的颜色 | 实测有效 |
android:inputType="number" | 限制输入内容的格式 | 这个内容有点多,大家可以自行百度 |
android:maxLength="12" | 限制文本的最大长度,超出部分将不会显示 | 实测有效 |
android:digits="123456789#" | 限制能够输入的字符 | 实测有效,比如当前就是只能输入123456789#中的某一个 |
android:textCursorDrawable="@drawable/img" | 设置光标样式 | 可以设置图片哟,实测有效,但是不能直接设置颜色(无效,因为单纯设置颜色没有宽度),在下面我加上如何修改它的光标的颜色 |
android:textStyle="bold" | 设置文本字体样式[bold/italic/normal][加粗/倾斜/默认] | 实测有效,跟TextView的一样 |
android:textAlignment="center" | 设置EditText中文本显示的位置[center/inherit/viewStart/viewEnd/textStart/textEnd][居中/默认/居左显示/居右显示/居左显示/居右显示] | 实测有效 |
android:textColorHighlight="@color/hignlight" | 设置被选中字体的颜色.默认为主题中的 “colorAccent”的颜色 | 实测有效 |
android:background="@null" | 设置EditText背景."@null"设置背景为透明.当我们设置背景后,EditText的那条线就会消失 | 实测有效 |
android:drawableXXX="@drawable/del" | 周边的图片 | 实测有效,比如实现登录框前面加上个人的图像,就可以直接使用android:drawableLeft |
android:imeOptions="actionSearch" | 设置虚拟键盘右下角的Enter键样式和动作 | 需要加上inputType才能生效哦,这个内容也有点多,大家也自行百度吧 |
对于上面的属性,比较有意思的是修改光标,我们一起来做一做。首先改为我们自己想要的图片,效果图如下
emmmmm,其实就是设置
<EditText
android:layout_width="match_parent"
android:id="@+id/edittext"
android:imeOptions="actionSearch"
android:textCursorDrawable="@drawable/cursor"
android:layout_height="50dp" />
但是,需要注意的是,图片不要尺寸太大,不然拉伸之后那场面。。。同理,用drawableXXX这些属性时,图片也要控制下大小。
其次就是如何改变光标的颜色的问题了,我在上面说过,直接设置颜色无效是因为颜色没有宽度,那我们给它设置上宽度就行了,如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#89FF22"/>
<size android:width="2dp"/>
</shape>
这样子,我们的光标颜色的控制权就在我们手上了,写成样式,我们就可以一键修改所有的EditText的光标颜色了。
我们改完竖着的线,那横着的线咋改列(下划线)???好像没有属性可以直接改。么得事,我们不是可以设置background为@null吗,这样子它就不见了,看不到心不烦。哈哈哈哈,好吧,我不会设置,但是我一点都不慌,我反手打开浏览器一查,方法就出来了,我们一起来试试。
我们需要先定义两个资源文件分别表示获得焦点时和没有焦点时的样式,如下
没有焦点时:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:height="3dp"/>
<solid android:color="@color/colorPrimary"/>
</shape>
有焦点时:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:height="3dp"/>
<solid android:color="@color/colorAccent"/>
</shape>
然后,我们同样去给background设置一个资源文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 获得焦点时 -->
<item android:state_focused="true"
android:drawable="@drawable/link_focused_1"/>
<!-- 未获得焦点时 -->
<item android:state_focused="false"
android:drawable="@drawable/link_focused_0"/>
</selector>
然后,我们给它设置上,这样子,横着的颜色也掌控在我们手里了,哈哈哈
是吧,是不是感觉很厉害了,可是,产品妹子的功力还是比我深,要我对输入的内容进行判断,,,,,,哎,,,又要写一堆判断,还可能要用到正则表达式,,难受呀。那可不可以写个方法类当做过滤网,每次需要的时候把内容丢进去过滤一次咧,当然是可以的。不过我们能想到,源码大佬们也想到了,于是大佬们准备了 InputFilter 这个接口。这个接口就是用来过滤我们的输入内容的,比如:
好吧,我也不会用,我再反手一查,如下的代码就出来了
InputFilter filter=new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
Log.e("InputFilter","source = " + source);
Log.e("InputFilter","start = " + start);
Log.e("InputFilter","end = " + end);
Log.e("InputFilter","dest = " + dest);
Log.e("InputFilter","dstart = " + dstart);
Log.e("InputFilter","dend = " + dend);
return source;
}
};
//可以设置多个InputFilter
edittext.setFilters(new InputFilter[]{filter});
我们运行试试:输入 2546 然后 删除一个
InputFilter: source = 2
InputFilter: start = 0
InputFilter: end = 1
InputFilter: dest =
InputFilter: dstart = 0
InputFilter: dend = 0
InputFilter: source = 5
InputFilter: start = 0
InputFilter: end = 1
InputFilter: dest = 2
InputFilter: dstart = 1
InputFilter: dend = 1
InputFilter: source = 4
InputFilter: start = 0
InputFilter: end = 1
InputFilter: dest = 25
InputFilter: dstart = 2
InputFilter: dend = 2
InputFilter: source = 6
InputFilter: start = 0
InputFilter: end = 1
InputFilter: dest = 254
InputFilter: dstart = 3
InputFilter: dend = 3
InputFilter: source =
InputFilter: start = 0
InputFilter: end = 0
InputFilter: dest = 2546
InputFilter: dstart = 3
nputFilter: dend =
?????什么鬼?看样子source字段是表示我们每次输入的字符,而删除的时候为空,dest表示的是我们输入之前的内容,其它的,emmmm,我也不理解 ,,, 等我理解了再补上来(客套话)
试到这里,emmmmm,我感觉,还是用正则吧(道行太浅,大佬教教我这玩意咋用)
在粘贴下面的内容的时候,突然发现,好像我还做过密码可见不可见的操作,不多说,粘代码
变为可见
edittext.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
变为不可见
edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD );
更新一:关于DrawableXXX相关图片太大了咋处理(这里原理是一样的,所以我直接从我的TextView的总结里面粘贴过来的,哎,人懒了没办法)
比如:
这样子,是不是很脑壳疼,你说拆开写吧,麻烦,不拆开吧,很麻烦,所以,我找到了解决办法,请看:(在drawable中新建一个资源文件,把图片和它的大小写在这里)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/main_img_people"
android:width="30dp"
android:height="30dp"
/>
</layer-list >
然后,在TextView中加入:
<TextView
android:layout_width="match_parent"
android:text="Hahahahah"
android:textSize="20sp"
android:layout_marginTop="100dp"
android:textColor="#000000"
android:id="@+id/text"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:drawableLeft="@drawable/main_img_people"
android:layout_height="50dp" />
于是,现在就变成这样了
在代码中也可以去设置图片大小(哪怕之前没有加图片),代码如下
Drawable drawable = getResources().getDrawable(R.drawable.main_img_people);//找到图片
drawable.setBounds(0, 0, 60, 60);//设置大小
textView.setCompoundDrawables(drawable, null, null, null);//设置图片(对应左上右下)
啊哈哈哈哈,这样子,就可以对TextView周边的图片为所欲为了。
emmm,最后,把上面需要自行百度的内容粘贴过来吧,免得找得麻烦,请大家笑纳!!
meOptions的可选值:(记得和inputType一起用哦,不然没效果我不负责的!)
字段 | 说明 |
---|---|
actionGo | 跳转样式 |
actionNone | 默认样式 |
actionSearch | 搜索样式 |
actionNext | 下一步样式 |
actionUnspecified | 默认样式 |
actionPrevious | 上一步样式 |
actionDone | 完成样式 |
actionSend | 发送样式 |
inputType属性
字段 | 说明 |
---|---|
ndroid:inputType=”none” | 不做任何限制 |
android:inputType=”text” | 文本 |
android:inputType=”textCapCharacters” | 字母大写 |
android:inputType=”textCapWords” | 首字母大写 |
android:inputType=”textCapSentences” | 仅第一个字母大写 |
android:inputType=”textAutoCorrect” | 自动完成 |
android:inputType=”textAutoComplete” | 自动完成 |
android:inputType=”textMultiLine” | 多行输入 |
android:inputType=”textImeMultiLine” | 输入法多行(如果支持) |
android:inputType=”textNoSuggestions” | 不提示 |
android:inputType=”textUri” | 网址 |
android:inputType=”textEmailAddress” | 电子邮件地址 |
android:inputType=”textEmailSubject” | 邮件主题 |
android:inputType=”textShortMessage” | 短讯 |
android:inputType=”textLongMessage” | 长信息 |
android:inputType=”textPersonName” | 人名 |
android:inputType=”textPostalAddress” | 地址 |
android:inputType=”textPassword” | 密码 |
android:inputType=”textVisiblePassword” | 可见密码 |
android:inputType=”textWebEditText” | 作为网页表单的文本 |
android:inputType=”textFilter” | 文本筛选过滤 |
android:inputType=”textPhonetic” | 拼音输入 |
android:inputType=”number” | 数字 |
android:inputType=”numberSigned” | 带符号数字格式 |
android:inputType=”numberDecimal” | 带小数点的浮点格式 |
android:inputType=”phone” | 拨号键盘 |
android:inputType=”datetime” | 时间日期 |
android:inputType=”date” | 日期键盘 |
android:inputType=”time” | 时间键盘 |
好了,这篇文章先到这里,后期有新的的再补充(客套话)。