【Code-Snippet】EditView

1 .替换Hint的Focused颜色

使用: android:textColorHint="@drawable/edittext_hintcolor_selector"去指定: 那么,我们的XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="false" android:color="#8d9fa8"/>
    <item android:state_focused="true" android:color="#00cbfe"/>
</selector>
复制代码

2 .替换下划线的颜色

使用: android:background="@drawable/edit_msg_dialog_bg"去替换: 这里给出一个例子:

  • edit_msg_dialog_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/line_et_focus"/>
    <item android:drawable="@drawable/line_et_normal"/>
</selector>
复制代码

上面的bg指定了Focused的时候的样式:

  • line_et_focus.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item
        android:left="-2dip"
        android:right="-2dip"
        android:top="-2dip">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dip"
                android:color="@android:color/holo_green_light"
                android:dashGap="0dp"
                android:dashWidth="0dip" />
        </shape>
    </item>
</layer-list>
复制代码
  • line_et_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item
        android:left="-2dip"
        android:right="-2dip"
        android:top="-2dip">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                android:width="1dip"
                android:color="#cecece"
                android:dashGap="0dp"
                android:dashWidth="0dip" />
        </shape>
    </item>
</layer-list>
复制代码

3. 文字变化监听

使用TextWatcher监听EditText变化

/**
 * 监听EditText框中的变化
 */
mEditText.addTextChangedListener(new TextWatcher() {
    private CharSequence temp;
    private int editStart;
    private int editEnd;

    /**
    * 	在字符串s内,从索引为start(包含)的字符开始的count个字
    *		符将被长度为after的新文本代替
    * @param s
    * @param start
    * @param count
    * @param after
    */
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        temp = s;
    }

    /**
    * 	在字符串s内,从索引为start(包含)的字符开始count个字符
    *		刚刚替换了长度为before的旧字符
    * @param s
    * @param start
    * @param before
    * @param count
    */
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mTextView.setText("输入的结果为:"+s);
    }

    /**
    * 字符串s内容已经发生了变化.可以在这一步对s进行合理的变更,但是要注意不要进入
    *无限循环,因为字符串的任何变化都会再次递归调用此回调方法.在这个方法中不会告
    * 诉 你字符串哪些内容发生了变化,因为其他针对字符串的改变已经调用了
    * afterTextChanged().如果你想知道哪些发生了变化,可以在
    * onTextChanged(CharSequence, int, int, int)使用setSpan(Object, int, int, int)
    * @param s
    */
    @Override
    public void afterTextChanged(Editable s) {
        editStart = mEditText.getSelectionStart();
        editEnd = mEditText.getSelectionEnd();
        if (temp.length() > 10) {//限制长度
            Toast.makeText(MainActivity.this,"输入的字数已经超过了限制!", 
                Toast.LENGTH_SHORT).show();
            s.delete(editStart - 1, editEnd);
            int tempSelection = editStart;
            mEditText.setText(s);
            mEditText.setSelection(tempSelection);
        }
    }
});
复制代码

4.EditText在界面初始化后,不自动获取焦点

使EditText不自动获取焦点,拿到光标

Android中Activity中某个EditText被clearFocus后其他控件(别的EditText)也不要获得焦点

同样的问题:Android中Activity中某个EditText被clearFocus后其他控件(别的EditText),会自动获取到焦点,此时也可以用以下的方法解决。在布局的最外层,顶级父布局中,设置:

android:focusable="true"
android:focusableInTouchMode="true"
复制代码

这样,就把EditText默认的行为截断了!在未点击Edittext前,EditText不会显示光标

5.EditText光标移动到文本框末尾

EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
复制代码

6. 限制输入的字符

如何限制只能输入指定的字符
设置 android:digits 属性即可

android:digits = "abcdef"
限制只能输入:abcdef

android:digits="1234567890"
限制只能输入数字
复制代码

7. 每N位数字插入空格

这里以手机号为例,每使用空格分隔成,3,4,4的样子,类似:130 1234 5678 的样子,手机号码为11位,但是因为有特殊字符(代码中将空格替换为想要的字符)或者空格,所以EditText的 android:maxLength="13" 属性要设置为大于11,我的由于存在两个空格,所以设置最大为13。

android:digits="1234567890"<!--只允许输入这10个数字-->
复制代码
private boolean flagIsDeletePhoneEt = false;
etPhone.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        int length = s.toString().length();
        //删除数字
        if (count == 0) {
            flagIsDeletePhoneEt = true;
        }
        //添加数字
        if (count == 1) {
            if (length == 4) {
                String part1 = s.subSequence(0, 3).toString();
                String part2 = s.subSequence(3, length).toString();
                etPhone.setText(part1 + " " + part2);
            }
            if (length==9){
                String part1 = s.subSequence(0, 8).toString();
                String part2 = s.subSequence(8, length).toString();
                etPhone.setText(part1 + " " + part2);
            }
            flagIsDeletePhoneEt = false;
        }
    }
    @Override
    public void afterTextChanged(Editable s) {
        //将光标移动到末尾
        if (!flagIsDeletePhoneEt)
            etPhone.setSelection(etPhone.getText().toString().length());
        checkIsFullWrite(btnLogin,etPhone,etVerificationCode);
    }
});
复制代码

虽然效果做出来了,但是当我们调用etPhone.getText().toString()方法时, 你会发现得到的结果里也是包含空格或者特殊字符的一串号码。如果想要纯 数字的结果,那么就需要对结果进行一下处理:

//从EditText获取的字符串
String phoneNum=etPhone.getText().toString();
//纯数字字符串
String number=formatPhoneNum(phoneNum);

    /**
     * 去掉手机号内除数字外的所有字符
     *
     * @param phoneNum 手机号
     * @return
     */
    private String formatPhoneNum(String phoneNum) {
        String regex = "(\\+86)|[^0-9]";
        Pattern pattern = Pattern.compile(regex );
        Matcher matcher = pattern.matcher(phoneNum);
        return matcher.replaceAll("");
    }
复制代码

8. 点击Edittext弹出软键盘,点击空白区域让软键盘消失

浅谈BaseActivity写法,促使我们更高效开发

思路:在Activity的事件分发方法中去判断,当前的焦点是否在Et上,如果是,则清除焦点和关闭软盘。

/**
 * 清除editText的焦点
 * @param views views
 */
public void clearViewFocus(View v, View[] views) {
    if (null != views && views.length > 0) {
        for (View view : views) {
            if (v==view) {
                view.clearFocus();
                return;
            }
        }
    }
}

/**
 * 是否焦点在Et上
 *
 * @param v   焦点所在View
 * @param views 输入框
 * @return true代表焦点在edit上
 */
public boolean isFocusEditText(View v, View[] views) {
    if (v instanceof EditText) {
        EditText et = (EditText) v;
        for (View view : views) {
            if (et.getId() == view.getId()) {
                return true;
            }
        }
    }
    return false;
}

/**
 * 判断触摸点,是否在过滤控件上
 * @param views views
 * @param ev ev
 * @return true / false
 */
public boolean isTouchView(View[] views, MotionEvent ev) {
    if (views == null || views.length == 0) {
        return false;
    }
    int[] location = new int[2];
    for (View view : views) {
        view.getLocationOnScreen(location);
        int x = location[0];
        int y = location[1];
        if (ev.getX() > x && ev.getX() < (x + view.getWidth())
                && ev.getY() > y && ev.getY() < (y + view.getHeight())) {
            return true;
        }
    }
    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        //1. 判断是否是点击了,过滤的控件
        if (isTouchView(filterViewByIds(), ev)) {
            return super.dispatchTouchEvent(ev);
        }
        //2. 如果 et 为空,则返回
        View[] views = hideSoftByEditViewIds();
        if (views == null || views.length == 0) {
            return super.dispatchTouchEvent(ev);
        }
        //3. 判断是否是是再次点击了 et 控件
        if (isTouchView(views, ev)) {
            return super.dispatchTouchEvent(ev);
        }
        //4. 获取到当前焦点的View,然后,判断是否 view 是否是 et 中的一个,
        //      若是,就清除焦点,关掉软盘
        View v = getCurrentFocus();
        if (isFocusEditText(v, views)) {
            clearViewFocus(v, views);
            closeKeyboard(this, v);
        }
    }
    return super.dispatchTouchEvent(ev);
}

public void closeKeyboard(Context context, View v) {
    InputMethodManager imm = (InputMethodManager) 
        context.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.hideSoftInputFromWindow(v.getWindowToken(),0);
    }
}

/**
 * 传入EditText的Id
 * 没有传入的EditText不做处理
 *
 * @return id 数组
 */
public View[] hideSoftByEditViewIds() {
    return new View[] { et1, et2 };
}

/**
 * 传入要过滤的View
 * 过滤之后点击将不会有隐藏软键盘的操作
 *
 * @return id 数组
 */
public View[] filterViewByIds() {
    return new View[] { et1, et2, btn};
}
复制代码

注意的是,如果当前的Activity中有多个Et,那么,清除其中一个Et后,别的Etd(布局中的第一个)会自动获取到焦点,其解决方法参考第4点。封装的工具类

9. 软键盘遮挡底部一点的问题

后面通过监听软键盘的高度进行解决。网上还有这个解决,为验证:【Android】EditText 遇到软键盘遮挡底部一点的问题

转载于:https://juejin.im/post/5c92029cf265da60ec2818c6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值