【Code-Snippet】EditView

1 .替换Hint的Focused颜色

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

<?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"去替换: 这里给出一个例子:html

  • 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的时候的样式:java

  • 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变化android

/** * 监听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不自动获取焦点,拿到光标git

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

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

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

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

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。ide

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 遇到软键盘遮挡底部一点的问题

相关文章
相关标签/搜索