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"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <size android:width="2dp" />
    <solid android:color="#ff7200" />
</shape>

然后在xml中设置

android:textCursorDrawable=”@drawable/edit_cursor_color”

全局设置
在AndroidManifest.xml中找到引用的主题

 <application
        android:allowBackup="true"
        android:icon="@mipmap/liyin_logo"
        android:label="@string/app_name"
        android:name=".appllication.MyAppBinder"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

在该主题下添加

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textCursorDrawable">@drawable/basic_edit_text_cursor</item><!--设置光标样式-->
    </style>

设置显示和隐藏密码

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);设置光标不显示
还可以调用getSelectionStart()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)));
<string name="filter_vcode_pwd">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</string>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容