EditText
设置单行,多行,自动换行,文字间距参考TextView
在EditText设置单行,由于android:single属性显示过时,提示用使用android:maxLines=”1”代替,但是设置之后没有任何效果。这是由于android:inputType属性默认值为none的缘故.只要将android:inputType属性设置为其他就可以了,TextView应该也是一样吧
设置默认提示文本
默认提示文本的两个属性如下:
android:hint="默认提示文本"android:textColorHint="#95A1AA"
前者设置提示的文本内容,后者设置提示文本的颜色!
设置光标颜色
在drawable文件夹下写个edit_cursor_color.xml文件
<?xml version="1.0" encoding="utf-8"?>
然后在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 特殊字符过滤和字符长度限制的最优方法
更多相关文章
- uni-app项目Android离线打包UrlSchemes设置
- Android横屏竖屏切换的问题
- Android(安卓)CheckBox中设置padding无效解决办法
- android TextView设置字过多长长度后面显示省略号失效
- [置顶] android:configChanges属性
- Android(安卓)给ImageView自定义设置边框
- Android(安卓)使用NDK R5开发JNI应用详解
- 教你如何创建类似QQ的android弹出菜单
- android TextView属性大全