设置单行,多行,自动换行,文字间距参考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()的方法,方法有两种形式:

image
一个参数的是设置光标位置的,两个参数的是设置起始位置与结束位置的中间括的部分,即部分选中!
当然我们也可以调用 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输入错误时该怎样提示用户

  1. 使用Toast提示
Toast. makeText ( this,  "邮箱格式不正确", Toast. LENGTH_LONG ). show ( ) ; 
  1. 使用EditText的setError提示
 EditText et  =  (EditText ) findViewById (R. id. etTest ) ;et. setError ( "有错误提示" ) ; 

PS:在EditText的右边使用TextView来提示,类似于网页中注册页面。需要注意的是EditText必须获得焦点才会弹出错误提示框。

  1. 自定义图标的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 特殊字符过滤和字符长度限制的最优方法

更多相关文章

  1. uni-app项目Android离线打包UrlSchemes设置
  2. Android横屏竖屏切换的问题
  3. Android(安卓)CheckBox中设置padding无效解决办法
  4. android TextView设置字过多长长度后面显示省略号失效
  5. [置顶] android:configChanges属性
  6. Android(安卓)给ImageView自定义设置边框
  7. Android(安卓)使用NDK R5开发JNI应用详解
  8. 教你如何创建类似QQ的android弹出菜单
  9. android TextView属性大全

随机推荐

  1. android 对象传输及parcel机制
  2. 玩转Android之Activity详细剖析
  3. Phonegap Device 获取设备信息
  4. mac终端配置Android(安卓)ADB命令
  5. Ubuntu11.10下编译android源码4.0.3
  6. 为什么应用商店里搜索不到你的App?
  7. android中的事件类型分为按键事件和屏幕
  8. update升级包版本信息的读取
  9. 如何成为Android高手
  10. 【Android笔记】执行命令行语句