EditText限制字符输入的几种方法

package com.example.editText;


import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.method.DigitsKeyListener;
import android.util.Log;
import android.widget.EditText;
/*
 * 方式1:xml中配置inputType。 常用于限制为 Date,time,number,Email,phone等常用的格式
 * 方式2:xml中配置digits。可以自定义限制的区间。
 * 方式3:java中使用setKeyListener,添加DigitsKeyListener。(方法2就是最终就是通过该方法实现)
 * 方法4:java中使用setFilters,添加InputFilter。可以在回调函数filter中自己写处理,最后返回处理过的CharSequence对象。
 * 
 * 方法:java中使用addTextChangedListener,添加 TextWatcher。不可行!!! (具体见最下面注释)
 */
public class MainActivity extends Activity {


private EditText et3, et4;
private final static String ET3_DIGITS = "abcd";
private final static String ET4_DIGITS = "wxyz";


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et3 = (EditText) findViewById(R.id.et3);
et4 = (EditText) findViewById(R.id.et4);


//方式3:java中使用setKeyListener,添加DigitsKeyListener。
et3.setKeyListener(DigitsKeyListener.getInstance(ET3_DIGITS));

//方法4:java中使用setFilters,添加InputFilter。
et4.setFilters(new InputFilter[] {new InputFilter() {

@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
//source:你即将输入的字符序列
Log.d("jie","source = "+source);

//start:默认为0,  end:你即将输入的字符序列的长度
Log.d("jie","start = "+ start);
Log.d("jie","end = "+ end);

//dest:当前EditText显示的内容
Log.d("jie","dest = "+dest);

//经测试dstart和dend 总是相等,都表示输入前光标所在位置
Log.d("jie","dstart = "+dstart);
Log.d("jie","dend = "+dend);

                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < source.length(); i++) {
                    if (ET4_DIGITS.indexOf(source.charAt(i)) >= 0) {
                        sb.append(source.charAt(i));
                    }
                }
                return sb;
}
}});


//使用TextWatcher,虽然能够检测到text 内容修改,但是不能进行重新赋值,因为你如果重新setText,又会重新触发该监听,会形成死循环,最终导致栈溢出。故该方法不可行
       /*et3.addTextChangedListener(new TextWatcher() {


@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}


@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (ET3_DIGITS.indexOf(s.charAt(i)) >= 0) {
sb.append(s.charAt(i));
}
}
et3.setText(sb);
}
});*/

}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值