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

本文介绍如何在Android应用中使用自定义InputFilter解决当输入框中需要限制中文字符数量时遇到的问题,通过实例展示了如何结合LengthFilter和自定义过滤逻辑,确保英文字符和中文字符输入的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般在监听输入可以使用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个字节,所以可以利用这个特性判断是否为中文字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值