设置单行,多行,自动换行,文字间距参考TextView
在EditText设置单行,由于android:single属性显示过时,提示用使用android:maxLines=”1”代替,但是设置之后没有任何效果。这是由于android:inputType属性默认值为none的缘故.只要将android:inputType属性设置为其他就可以了,TextView应该也是一样吧
设置默认提示文本
默认提示文本的两个属性如下:
android:hint="默认提示文本"
android:textColorHint="#95A1AA"
前者设置提示的文本内容,后者设置提示文本的颜色!
设置光标颜色
在drawable文件夹下写个edit_cursor_color.xml文件
然后在xml中设置
android:textCursorDrawable=”@drawable/edit_cursor_color”
全局设置
在AndroidManifest.xml中找到引用的主题
在该主题下添加
设置显示和隐藏密码
EditText 密码显示隐藏三种方法
//显示密码
//1、
EditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
//2、
EditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
//3、
EditText.setInputType(0x90);
//隐藏密码
//1、
EditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
//2、
EditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
//3、
EditText.setInputType(0x81);
第一种方法存在设置完一次之后,再次设置无效果的情况,推荐使用第二种方法
光标位置的控制
有时可能需要我们控制EditText中的光标移动到指定位置或者选中某些文本!EditText为我们提供了setSelection()的方法,方法有两种形式:
一个参数的是设置光标位置的,两个参数的是设置起始位置与结束位置的中间括的部分,即部分选中!
当然我们也可以调用 setSelectAllOnFocus(true);让EditText获得焦点时选中全部文本!
另外我们还可以调用 setCursorVisible(false);设置光标不显示
还可以调用g etSelectionStart()和 getSelectionEnd获得当前光标的前后位置
login_user_pwd_edt.setSelection(login_user_pwd_edt.getText().toString().length());//设置光标在最后
EditText获取焦点 失去焦点监听,获取焦点操作
实现方法也很简单、那就是绑定OnFocusChangeListener事件、实现onFocusChange(View v, boolean hasFocus) 方法、第二个参数就是判断得到焦点或失去焦点、从而实现我得想要的效果、代码如下
EditText searchView = (EditText) findViewById(R.id.search_text);
searchView.setOnFocusChangeListener(new android.view.View.
OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 此处为得到焦点时的处理内容
} else {
// 此处为失去焦点时的处理内容
}
}
});
文本框重新获取焦点方法:
searchView.setFocusable(true);
searchView.setFocusableInTouchMode(true);
searchView.requestFocus();
searchView.clearFocus();//失去焦点
searchView.requestFocus();//获取焦点
【Android】EditText获得焦点以及失去焦点
Android 设置Edittext获取焦点并弹出软键盘
获得焦点后全选组件内所有文本内容
当我们想在点击输入框获得焦点后,不是将光标移动到文本的开始或者结尾;而是 获取到输入框中所有的文本内容的话!这个时候我们可以使用selectAllOnFocus属性
android:selectAllOnFocus="true"
设置英文字母大写类型
EditText还为我们提供了设置英文字母大写类型的属性:
android:capitalize 默认none,提供了三个可选值:
- sentences:仅第一个字母大写
- words:每一个单词首字母大小,用空格区分单词
- characters:每一个英文字母都大写
EditText输入错误时该怎样提示用户
- 使用Toast提示
Toast. makeText ( this, "邮箱格式不正确", Toast. LENGTH_LONG ). show ( ) ;
- 使用EditText的setError提示
EditText et = (EditText ) findViewById (R. id. etTest ) ;
et. setError ( "有错误提示" ) ;
PS:在EditText的右边使用TextView来提示,类似于网页中注册页面。需要注意的是EditText必须获得焦点才会弹出错误提示框。
- 自定义图标的setError提示
Drawable d = getResources ( ). getDrawable (R. drawable. ic_launcher ) ;
d. setBounds ( 0, 0, 30, 30 ) ; //必须设置大小,否则不显示
et. setError ( "有错误提示", d ) ;
限制输入类型和软键盘弹出类型
限制输入类型
Android之设置EditText输入类型(setInputType()方法和android:inputType属性)
EditText中输入信息的限制的方法
代码 :et_lxnr.setInputType(InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE);
xml :
android:inputType="number" //设置输入为数字,弹出数字键盘
android:inputType="textPassword" //设置输入为密码,不显示明文
限制输入长度(如限制输入最大长度10)
代码:et_lxnr.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)});
xml:android:maxLength="10"
限制输入固定的某些字符(如123456xyz)
代码:et_lxnr.setKeyListener(DigitsKeyListener.getInstance(“123456xyz”);
xml:android:digits="@string/input_num_character"
示例
//设置只能输入字母数字
login_user_pwd_edt.setKeyListener(DigitsKeyListener.getInstance(getString(R.string.filter_vcode_pwd)));
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
TextWatcher(监听输入变化)
addTextChangedListener(文本监听)参数解释及实现EditText字数监听
Android TextWatcher三个回调详解,监听EditText的输入
Android 文本监听接口TextWatcher详解
EditText限制最大字符数(中文,字母,数字)
自定义TextWatcher,实现输入超出最大长度时提示的功能。
public class LengthTextWatcher implements TextWatcher {
private EditText editText = null;
private ImageView imageView = null;
private int editStart;
private int editEnd;
private int maxLen;//最大长度
private String toast;//超出最大长度时的提示语
/**
* @param editText
* @param maxLen
* @param toast
*/
public LengthTextWatcher(EditText editText, int maxLen, String toast) {
this.editText = editText;
this.maxLen = maxLen;
this.toast = toast;
}
/**
* @param editText
* @param imageView 清空图标
* @param maxLen
* @param toast
*/
public LengthTextWatcher(EditText editText, ImageView imageView, int maxLen, String toast) {
this.editText = editText;
this.imageView = imageView;
this.maxLen = maxLen;
this.toast = toast;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Logger.e("s=>>>>>>>>>>>" + s);
if (calculateLength(s.toString()) > maxLen && toast.length() > 0)
RxToast.normal(toast);
}
@Override
public void afterTextChanged(Editable s) {
editStart = editText.getSelectionStart();//得到光标的前后位置
editEnd = editText.getSelectionEnd();
// 先去掉监听器,否则会出现栈溢出
editText.removeTextChangedListener(this);
if (!TextUtils.isEmpty(editText.getText())) {
//删除超出的部分
while (calculateLength(s.toString()) > maxLen) {
s.delete(editStart - 1, editEnd);
editStart--;
editEnd--;
}
}
editText.setText(s);
editText.setSelection(editStart);//设置光标在句尾
// 恢复监听器
editText.addTextChangedListener(this);
if (imageView != null) {
if (TextUtils.isEmpty(s)) {
imageView.setVisibility(View.GONE);
} else {
imageView.setVisibility(View.VISIBLE);
}
}
}
/**
* 计算字符数,中文算2个,英文1个
*
* @param etstring
* @return
*/
private int calculateLength(String etstring) {
char[] ch = etstring.toCharArray();
int varlength = 0;
for (int i = 0; i < ch.length; i++) {
// changed by zyf 0825 , bug 6918,加入中文标点范围 , TODO 标点范围有待具体化
if ((ch[i] >= 0x2E80 && ch[i] <= 0xFE4F) || (ch[i] >= 0xA13F && ch[i] <= 0xAA40) || ch[i] >= 0x80) { // 中文字符范围0x4e00 0x9fbb
varlength = varlength + 2;
} else {
varlength++;
}
}
// 这里也可以使用getBytes,更准确嘛
// varlength = etstring.getBytes(CharSet.forName("GBK")).lenght;// 编码根据自己的需求,注意u8中文占3个字节...
return varlength;
}
}
调用
et_name.addTextChangedListener(new LengthTextWatcher(et_name, iv_clear_name, 16, ""));
InputFilter过滤器
1、Android--›InputFilter详解(用例:只能输入中文, 只能输入数字, 只能输入字母, 最大长度限制等)
https://blog.csdn.net/angcyo/article/details/81566066
2、Android开发之EditText字符串过滤器InputFilter
https://blog.csdn.net/talentclass_ctt/article/details/54773340
3、InputFilter详解、TextWatcher详解
https://blog.csdn.net/u014606081/article/details/53101629
示例:
public class CharInputFilter implements InputFilter {
//允许中文输入
public boolean IS_INPUT_CHINESE = false;
//允许输入大小写字母
public boolean IS_INPUT_LETTER = false;
//允许输入数字
public boolean IS_INPUT_NUMBER = false;
//允许输入Ascii码表的[33-126]的字符,包含数字字母和特殊符号
public boolean IS_INPUT_ASCII_CHAR = false;
//限制输入的最大字符数, 小于0不限制
private int maxInputLength = -1;
public CharInputFilter() {
}
public void setIS_INPUT_CHINESE(boolean IS_INPUT_CHINESE) {
this.IS_INPUT_CHINESE = IS_INPUT_CHINESE;
}
public void setIS_INPUT_LETTER(boolean IS_INPUT_LETTER) {
this.IS_INPUT_LETTER = IS_INPUT_LETTER;
}
public void setIS_INPUT_NUMBER(boolean IS_INPUT_NUMBER) {
this.IS_INPUT_NUMBER = IS_INPUT_NUMBER;
}
public void setIS_INPUT_ASCII_CHAR(boolean IS_INPUT_ASCII_CHAR) {
this.IS_INPUT_ASCII_CHAR = IS_INPUT_ASCII_CHAR;
}
public void setMaxInputLength(int maxInputLength) {
this.maxInputLength = maxInputLength;
}
/**
* 是否是中文
*/
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
/**
* 是否是大小写字母
*/
public static boolean isCharLetter(char c) {
// Allow [a-zA-Z]
if ('a' <= c && c <= 'z')
return true;
if ('A' <= c && c <= 'Z')
return true;
return false;
}
public static boolean isNumber(char c) {
return ('0' <= c && c <= '9');
}
public static boolean isAsciiChar(char c) {
return (33 <= c && c <= 126);
}
/**
* @param source 本次需要更新的字符串, (可以理解为输入法输入的字符,比如:我是文本)
* @param start 取 source 字符串的开始位置,通常是0
* @param end 取 source 字符串的结束位置,通常是source.length()
* @param dest 原始字符串
* @param dstart 原始字符串开始的位置
* @param dend 原始字符串结束的位置, 这种情况会在你已经选中了很多个字符, 然后用输入法输入字符的情况下
* @return
*/
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
//此次操作后, 原来的字符数量
int length = dest.length() - (dend - dstart);
if (maxInputLength > 0) {
if (length == maxInputLength) {
return "";
}
}
SpannableStringBuilder modification = new SpannableStringBuilder();
for (int i = start; i < end; i++) {
char c = source.charAt(i);
boolean append = false;
if (IS_INPUT_CHINESE) {
append = isChinese(c) || append;
}
if (IS_INPUT_LETTER) {
append = isCharLetter(c) || append;
}
if (IS_INPUT_NUMBER) {
append = isNumber(c) || append;
}
if (IS_INPUT_ASCII_CHAR) {
append = isAsciiChar(c) || append;
}
if (append) {
modification.append(c);
}
}
if (maxInputLength > 0) {
int newLength = length + modification.length();
if (newLength > maxInputLength) {
//越界
modification.delete(maxInputLength - length, modification.length());
}
}
return modification;//返回修改后, 允许输入的字符串. 返回null, 由系统处理.
}
}
遇到的问题
用InputFilter限制输入长度时,在一些手机(如LG)的英文输入法输入时会莫名多出一些字符等问题:
关于android 中EditText 特殊字符过滤和字符长度限制的最优方法