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中设置

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 特殊字符过滤和字符长度限制的最优方法

你可能感兴趣的:(EditText)