EditText是继承TextView的。目前新版本的源码中,EditText几乎没有什么内容,大部分内容放在了TextView中,所以此篇内容源码部分不局限于EditText。这也是查看源码经常性的操作。
1.先看常用操作。setText/getText
@Override public Editable getText() { return (Editable) super.getText(); } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, BufferType.EDITABLE); }
getText调用了父类中的相同方法,只是在EditText中加了转型Editable。故名思义,这是一个操作text的类
点进去看下
这是一个继承了四个接口的接口。有我们比较熟悉的Charsequence和Spannable.基本方法和Spring类似都是对text的操作。
setText也调用了父类中的方法,但设置了一个BufferType。我们常用的TextView中的setText(Charsequence)
@android.view.RemotableViewMethod public final void setText(CharSequence text) { setText(text, mBufferType); }
TextView中默认的BufferType是BufferType.NORMAL。
public enum BufferType { NORMAL, SPANNABLE, EDITABLE, }
这是一个形容文本内容的枚举类。只有三个常量NORAML(正常的一般文本)、SPANNABLE(span类型文本,此文后面讲述用法)、EDITEABLE(可编辑的,EditText中的文本均为此类)
上述知识点应用示例
自定义一个只显示部分内容的TextView控件。大概是这种显示:“6222**********************953”
显然我们是需要继承TextView并重写setText和getText方法的。由于常规的setText(charsequence)方法是final修饰的,无法在子类重写。故我们需要调用setText(text,buffertype)方法。自定义setText(charsequence)方法,setText(chafrsequence,BufferType.NORMAL)即可达到相同的效果
2.Inputtype的种类与作用
xml属性共有32种,可代码设置方法为setInputype()。
其实Inputtype本身也是一个接口,它支持四大类类型(TEXT/PHONE/NUMBER/DATETIME)
常用的有
text/textPassword/phone/number/numberPassword/numberDecimal
对应的InputType为
TYPE_CLASS_TEXT/TYPE_TEXT_VARIATION_PASSSWORD/TYPE_CLASS_PHONE/TYPE_CLASS_NUMBER/TYPE_NUMBER_VARIATION_PASSWORD/TYPE_NUMBER_FLAG_DECIMAL
有时我们会遇到输入密码明文显示的情况。相对应的inputType为TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
注意:上述是输入的密码明文显示。若是动态变换显示edittext上已经存在的密码。则应该设置transformationMethod
setTransformationMethod(TransformationMethod)
类结构如下:
通常我们使用的是HideReturnsTransformationMethod和PasswordTransformationMethod
对应的操作代码为
etpwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());//密码以明文显示
etpwd.setTransformationMethod(PasswordTransformationMethod.getInstance());//以密文显示,以.代替
3.监听文本改变
addTextChangedListener(TextWatcher)。通过此设置可以监听Edittext中text的变化。
4.Spanned/SpannableString /SpannableStringBuilder
相关关系及用法网上很多。这是我觉得不错的一篇,直接放链接