对于Edittext大家都是不陌生的,在这里就不多说什么了,直接进入主题,写此篇只是为了记录一下Edittext的一些使用技巧:
1.限制输入范围方法一:
/**
* 限制输入数字的范围
*/
public class RegionNumberEditText extends EditText {
private Context context;
private int max;
private int min;
public RegionNumberEditText(Context context) {
super(context);
this.context = context;
}
public RegionNumberEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public RegionNumberEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
}
/**
* 设置输入数字的范围
* @param maxNum 最大数
* @param minNum 最小数
*/
public void setRegion(int maxNum, int minNum) {
setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
this.max = maxNum;
this.min = minNum;
}
public void setTextWatcher() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (start >= 0) {//从一输入就开始判断,
if (min != -1 && max != -1) {
try {
int num = Integer.parseInt(s.toString());
//判断当前edittext中的数字(可能一开始Edittext中有数字)是否大于max
if (num > max) {
s = String.valueOf(max);//如果大于max,则内容为max
setText(s);
Prompt.showTips(context, "金额不能超过" + max + "元");
} else if (num < min) {
s = String.valueOf(min);//如果小于min,则内容为min
}
} catch (NumberFormatException e) {
LFLog.e("ontextchanged", "==" + e.toString());
}
//edittext中的数字在max和min之间,则不做处理,正常显示即可。
return;
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
调用:
RegionNumberEditText edittext=new RegionNumberEditText(this);
edittext.setRegion(100,0);
edittext.setTextWatcher();
2.限制输入范围方法二:
public class EditInputFilter implements InputFilter{
/**
* 最大数字
*/
public static final int MAX_VALUE = 10000;
/**
* 小数点后的数字的位数
*/
public static final int PONTINT_LENGTH = 2;
Pattern p;
public EditInputFilter(){
p = Pattern.compile("[0-9]*"); //除数字外的其他的
}
/**
* source 新输入的字符串
* start 新输入的字符串起始下标,一般为0
* end 新输入的字符串终点下标,一般为source长度-1
* dest 输入之前文本框内容
* dstart 原内容起始坐标,一般为0
* dend 原内容终点坐标,一般为dest长度-1
*/
@Override
public CharSequence filter(CharSequence src, int start, int end,
Spanned dest, int dstart, int dend) {
String oldtext = dest.toString();
System.out.println(oldtext);
//验证删除等按键
if ("".equals(src.toString())) {
return null;
}
//验证非数字或者小数点的情况
Matcher m = p.matcher(src);
if(oldtext.contains(".")){
//已经存在小数点的情况下,只能输入数字
if(!m.matches()){
return null;
}
}else{
//未输入小数点的情况下,可以输入小数点和数字
if(!m.matches() && !src.equals(".") ){
return null;
}
}
//验证输入金额的大小
if(!src.toString().equals("")){
double dold = Double.parseDouble(oldtext+src.toString());
if(dold > MAX_VALUE){
CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
return dest.subSequence(dstart, dend);
}else if(dold == MAX_VALUE){
if(src.toString().equals(".")){
CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
return dest.subSequence(dstart, dend);
}
}
}
//验证小数位精度是否正确
if(oldtext.contains(".")){
int index = oldtext.indexOf(".");
int len = dend - index;
//小数位只能2位
if(len > PONTINT_LENGTH){
CharSequence newText = dest.subSequence(dstart, dend);
return newText;
}
}
return dest.subSequence(dstart, dend) +src.toString();
}
}
调用:
InputFilter[] filters = { new EditInputFilter() };
edit.setFilters(filters);
3.限制输入范围方法三(我用到的一种方法):
/**
* 设置小数后位数控制
*/
private InputFilter lendFilter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
// 删除等特殊字符,直接返回
if ("".equals(source.toString())) {
return null;
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int diff = dotValue.length() + 1 - 4;//4表示输入框的小数位数
if (diff > 0) {
return source.subSequence(start, end - diff);
}
}
return null;
}
};
调用:
et_lend_maximum_number.setFilters(new InputFilter[]{lendFilter});
下面是类似的使用:
a.EditText的属性中加上:
android:inputType="numberDecimal"
/** 输入框小数的位数*/
private static final int DECIMAL_DIGITS = 1;
/**
* 设置小数位数控制
*/
InputFilter lengthfilter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
// 删除等特殊字符,直接返回
if ("".equals(source.toString())) {
return null;
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int diff = dotValue.length() + 1 - DECIMAL_DIGITS;
if (diff > 0) {
return source.subSequence(start, end - diff);
}
}
return null;
}
};
mEt.addTextChangedListener(mTextWatcher);
// 控制输入框的小数位和长度,这里长度暂时设置为10
mEt.setFilters(new InputFilter[] { lengthfilter, new InputFilter.LengthFilter(10) });
还可以这样写:
//设置输入框允许输入的类型(正则)
//对应的布局属性是--->android:digits="0123456789."
setKeyListener(DigitsKeyListener.getInstance("0123456789."));
//设置输入字符
setFilters(new InputFilter[]{inputFilter});
addTextChangedListener(this);
4.通过布局属性来控制:
maxLength、inputType、minLength、digits等
a.设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。比如要限制只能输入数字和字母,可以这样:
android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。 PS:吐槽一下,写着好累,不支持区间操作符~或-
b.顺便说说inputType属性:
<EditText
//电话号码
android:inputType="phone"
//文本类型,多为大写、小写和数字符号。
android: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="datetime" //时间日期
android:inputType="date" //日期键盘
android:inputType="time" //时间键盘
/>
c.imeOptions属性
当我们手机横屏,且使用Android自带的软键盘为EditText进行文本输入时,若不进行特殊的设置,该软键盘会占用整个界面,那么,如何让键盘只占用屏幕的一部分呢? 其实只需要改一个小小的属性即可!
<EditText
android:id="@+id/text1"
android:imeOptions="flagNoExtractUi"/>
另外使用android:imeOptinos可对Android自带的软键盘进行一些界面上的设置:
android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕
同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键
android:imeOptions="actionNone" //输入框右侧不带任何提示
android:imeOptions="actionGo" //右下角按键内容为'开始'
android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索
android:imeOptions="actionSend" //右下角按键内容为'发送'
android:imeOptions="actionNext" //右下角按键内容为'下一步'
android:imeOptions="actionDone" //右下角按键内容为'完成'
同时,可能EditText添加相应的监听器,捕捉用户点击了软键盘右下角按钮的监听事件,以便进行处理。
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Toast.makeText(MainActivity.this, "text2", Toast.LENGTH_SHORT).show();
return false;
}
});
5.EditText在XML布局中设置inputType后hint字体会改变,如下图:
由于手机号码和验证码输入的都是整数,inputType为number,而密码则是textPassword,做国际化的话,用英文显示字体是不同的,看着多了一点间距,而中文是相同的,下面是两个属性:
android:inputType="textPassword"
android:inputType="number"
接下来我们来看看怎么解决:
a.第一种方法:在代码中加上这两行代码
EditText.setTypeface(Typeface.DEFAULT);
EditText.setTransformationMethod(new PasswordTransformationMethod());
第一种方法要注意一下,上面的代码只适合于隐藏的密码之类的,若是手机号码或验证码的话,必须不可以为......,所以可以用下面的代码:
et_register_phone_num.setTypeface(Typeface.DEFAULT);
et_register_phone_num.setTransformationMethod(new HideReturnsTransformationMethod());
b.第二种方法:
setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
6.密码的显示隐藏:
/**
* 抽取CheckBox与EditTextd的使用赋值方法
*
* @param a
* @param b
*/
private void checkedChangeListener(CheckBox a, final EditText b) {
a.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
//设置EditText文本为可见的
b.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
//设置EditText文本为隐藏的
b.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
b.postInvalidate();
//切换后将EditText光标置于末尾
CharSequence charSequence = b.getText();
if (charSequence instanceof Spannable) {
Spannable spanText = (Spannable) charSequence;
Selection.setSelection(spanText, charSequence.length());
}
}
});
}