在android输入框中禁止中文输入

来源:互联网 发布:sketch中文破解版 mac 编辑:程序博客网 时间:2024/05/16 01:48

一般在监听输入可以使用TextWatcher这个监视器,但是动态输入还使用它的话就会出现bug,因为Watcher观察者的3个函数都不是那么好使用,使得输入缓冲区有中文不会显示在输入框中,即使使用截断字符创的方式来控制显示,但是如果输入了一串英文字符后,再将光标定位在英文字符串中进行输入中文,bug就出现了。这个时候就必须使用filter来过滤了。


废话少说,看代码:

情景:如果有中文字符的话,输入框只能输入固定字符比如说6个,如果全英文字符,可以输入20个,如果超过6个字符,想输入中文的话,就将中文过滤。


package cn.edu.wtu;

import java.io.UnsupportedEncodingException;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;
import android.widget.EditText;

public class InputFilterActivity extends Activity {
    /** Called when the activity is first created. */
    private static final String TAG = "InputFilterActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final EditText edit =  (EditText)findViewById(R.id.editText1);
        edit.setText("moon");
        edit.setFilters(new InputFilter[]{
                new InputFilter.LengthFilter(20),
                new InputFilter(){
                    
                    @Override
                    public CharSequence filter(CharSequence source, int start,
                            int end, Spanned dest, int dstart, int dend) {
                        // TODO Auto-generated method stub
                        Log.d(TAG, source.toString()+"\tstart:"+start+"\tend:"+end);
                        Log.d(TAG, dest.toString()+"\tdstart:"+dstart+"\tdend:"+dend);
                        if(isCN(source.toString())){
                            if(dstart >= 6){
                                edit.setSelection(dstart);
                                return "";
                            }else{
                                if(source.length()+dest.length() > 6){
                                    return source.subSequence(start, start+6-dest.length());
                                }else{
                                    return source;
                                }
                            }
                        }else{
                            return source;
                        }
                    }
                    
                }
        });
    }
    
    public boolean isCN(String str){
        try {
            byte [] bytes = str.getBytes("UTF-8");
            if(bytes.length == str.length()){
                return false;
            }else{
                return true;
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
}


xml文件就不贴了,很简单,因为中文的UNICODE编码是2个字节,所以可以利用这个特性判断是否为中文字符

原创粉丝点击