Android开发中EditText的使用总结

Edittext光标移到最后

Edittext.setSelection(content.length());

隐藏EditText中的下划线

 android:background="@null"

弹出键盘遮挡一半Edittext解决办法

去掉 Edittext 的固定高度,改为 wrap_content,然后使用 padding 值即可

字符串过滤器InputFilter使用

作用和用法

作用
如果我们要进行一些复杂的输入控制(比如:限制单字节多少位;限制只能输入业务要求的特定的字符等)就要用 InputFilter 了

用法
1、创建一个类去 implements InputFilter,实现 filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)方法
2、在要用到的地方调用 EditText 的 setFilters(InputFilter[] filters)方法

public abstract CharSequence filter ( 
    CharSequence source,  //输入的文字 ,即将输入的字符串
    int start,  //开始位置 ,source的start
    int end,  //结束位置 ,source的end,或理解为长度
    Spanned dest, //当前显示的内容 ,输入框中原来的内容
    int dstart,  //当前开始位置,要替换或者添加的起始位置,即光标所在的位置 
    int dend //当前的结束位置,要替换或者添加的终止始位置,若为选择一串字符串进行更改,则为选中字符串 最后一个字符在dest中的位置
);

栗子1:名称输入长度限制

import android.text.InputFilter;
import android.text.Spanned;

public class NameInputFilter implements InputFilter {
    private int mMaxLen = 16;

    public NameInputFilter() {
    }

    public NameInputFilter(int maxLen) {
        this.mMaxLen = maxLen;
    }

    @Override
    public CharSequence filter(CharSequence charSequence, int start, int end, Spanned dest, int dstart, int dend) {
        int dindex = 0;
        int count = 0; // 判断是否到达最大长度
        while (count <= mMaxLen && dindex < dest.length()) {
            char c = dest.charAt(dindex++);
            if (c < 128) {// 按ASCII码表0-127算
                count = count + 1;
            } else {
                count = count + 2;
            }
        }
        if (count > mMaxLen) {
            return dest.subSequence(0, dindex - 1);
        }

        int sindex = 0;
        while (count <= mMaxLen && sindex < charSequence.length()) {
            char c = charSequence.charAt(sindex++);
            if (c < 128) {
                count = count + 1;
            } else {
                count = count + 2;
            }
        }

        if (count > mMaxLen) {
            sindex--;
        }
        return charSequence.subSequence(0, sindex);
    }
}

用法

editText.setFilters(new NameInputFilter[]{new NameInputFilter(8)});// 表示单字节字符最长8位,双字节字符最长4位;根据业务传值

栗子2:数字最多输入小数点后两位

/**
 *金额输入过滤器,限制小数点后输入位数
 *
 * 默认限制小数点2位
 * 默认第一位输入小数点时,转换为0.
 * 如果起始位置为0,且第二位跟的不是".",则无法后续输入
 */

public class MoneyValueFilter extends DigitsKeyListener {

    private static final String TAG = "MoneyValueFilter";
    public MoneyValueFilter() {
        super(false, true);
    }

    private int digits = 2;

    public MoneyValueFilter setDigits(int d) {
        digits = d;
        return this;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);


        Log.d(TAG, "-------source:"+source);
        Log.d(TAG, "-------start:"+start);
        Log.d(TAG, "-------end:"+end);
        Log.d(TAG, "-------dest:"+dest);
        Log.d(TAG, "-------dstart:"+dstart);
        Log.d(TAG, "-------dend:"+dend);


        // if changed, replace the source
        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int len = end - start;

        // if deleting, source is empty
        // and deleting can't break anything
        if (len == 0) {
            return source;
        }

        //以点开始的时候,自动在前面添加0
        if(source.toString().equals(".") && dstart == 0){
            return "0.";
        }
        //如果起始位置为0,且第二位跟的不是".",则无法后续输入
        if(!source.toString().equals(".") && dest.toString().equals("0")){
            return "";
        }

        int dlen = dest.length();

        // Find the position of the decimal .
        for (int i = 0; i < dstart; i++) {
            if (dest.charAt(i) == '.') {
                // being here means, that a number has
                // been inserted after the dot
                // check if the amount of digits is right
                return (dlen-(i+1) + len > digits) ? 
                    "" :
                    new SpannableStringBuilder(source, start, end);
            }
        }

        for (int i = start; i < end; ++i) {
            if (source.charAt(i) == '.') {
                // being here means, dot has been inserted
                // check if the amount of digits is right
                if ((dlen-dend) + (end-(i + 1)) > digits)
                    return "";
                else
                    break;  // return new SpannableStringBuilder(source, start, end);
            }
        }


        Log.d(TAG, "-------return:"+new SpannableStringBuilder(source, start, end).toString());
        Log.d(TAG, "-----------------------");

        // if the dot is after the inserted part,
        // nothing can break
        return new SpannableStringBuilder(source, start, end);
    }
}

用法
xml

   <EditText
       android:id="@+id/et_inputFilter"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:inputType="numberDecimal"/>

代码中

editText.setFilters(new InputFilter[]{new MoneyValueFilter().setDigits(2)});

EditText获取焦点并显示软键盘

方法一:
AndroidManifest中相应activity
android:windowSoftInputMode=“stateAlwaysVisible”

方法二:

如果刚进入页面有请求数据操作,如果采用方法一,刚进入页面,软键盘会弹出,请求数据时页面如果不可点击,软键盘会消失,请求数据后,软键盘又会弹出,效果不是很好,可以采用以下方法,在请求完数据后,动态使键盘弹出

/**
     * EditText获取焦点并显示软键盘
     */
    public static void showSoftInputFromWindow(Activity activity, EditText editText) {
        editText.setFocusable(true);
        editText.setFocusableInTouchMode(true);
        editText.requestFocus();
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值