Android 如何限制editText中的某些字符
请不要急于将此邮件标记为“重复”。 我找不到合适的例子。 假设我想限制editText中的字符“{”Android 如何限制editText中的某些字符,android,android-edittext,Android,Android Edittext,请不要急于将此邮件标记为“重复”。 我找不到合适的例子。 假设我想限制editText中的字符“{” 让我们考虑一下我的代码的一些变体。我只在仿真器上尝试过。 editName.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { String txt=s.toString(); int len=txt
让我们考虑一下我的代码的一些变体。我只在仿真器上尝试过。
editName.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
String txt=s.toString();
int len=txt.length();
toastDebug("len="+myIntToStr(len));
if (len>0) {
try {
int pos=txt.indexOf("{");
if (pos>=0) s.replace(pos,pos+1,"");
}
catch(Exception e) {}
}
}
如果我快速键入“{”,将导致“stackOverFlow”崩溃。
假设我慢慢地键入“abcd{{{{{{}”,第一个视图看起来没问题,editText中没有“{”。
但如果我键入backspace,它不会删除“abcd”,而是删除那些不可见的“{{{{”
我试图更改“afterTextChanged”中的editText。下面的代码再次导致StackOverflowerError
public void afterTextChanged(Editable s) {
String txt=s.toString();
int len=txt.length();
if (len>0) {
try {
editName.setText(txt)
or
s.clear
s.append(txt)
}
catch(Exception e) {}
}
}
在我键入“{”后,许多示例都带有clear my editText
那么,我修改了这个代码如下:
editName.setFilters(new InputFilter[] { filterName });
private InputFilter filterName = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source==null) return null;
return source.toString().replace("{","");
}
};
现在它可以工作了。但是我的android:maxLength=“25”不能工作。
可以键入任意数量的字符
所以我很困惑,如何限制文本中的简单字符。
有什么想法吗?谢谢!您也可以通过
xml
使用它
android:digits="0,1,2,3,4,5,6,7,8,9,.,@,qwertzuiopasdfghjklyxcvbnm"
或
android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
你想把它放在这里。我的假设是
android:maxLength
实际上是一个InputFilter
,它添加到你的EditText
中。因此如果你想添加更多InputFilter
,你必须获得EditText
的当前InputFilter
数组,并用你自己的InputFilter附加它de>。我这样做,这就行了
EditText editName = (EditText) findViewById(R.id.editText1);
InputFilter filterName = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source==null) return null;
return source.toString().replace("{","");
}
};
//Get current Input Filter from EditText
InputFilter[] oldInputFilter = editName.getFilters();
//Create arrays for new InputFilter
InputFilter[] newInputFilter = new InputFilter[oldInputFilter.length+1];
//Copy all old Input Filter to new one
System.arraycopy(oldInputFilter, 0, newInputFilter, 0, oldInputFilter.length);
//Add your own input filter
newInputFilter[newInputFilter.length-1] = filterName;
//Set the new Input Filter
editName.setFilters(newInputFilter);
通过在小部件上设置TextWatcher
,并插入以下逻辑,可以限制用户可以在EditText
中输入的字符:
// we are interested in this callback
@Override
public void afterTextChanged(Editable s) {
String result = s.toString().replaceAll("\\{", "");
if (!s.toString().equals(result)) {
edit.setText(result); // "edit" being the EditText on which the TextWatcher was set
edit.setSelection(result.length()); // to set the cursor at the end of the current text
}
}
\\
是必需的(对于其他字符也是如此),因为{
字符在模式中具有特殊意义。上述正确答案仅适用于一个文本。
The above correct answer only work for one EditText.
But this work for all the EditText in you XML.
InputFilter filter = new InputFilter() {
boolean canEnterSpace = false;
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if(_edtUsername.getText().toString().equals(""))
{
canEnterSpace = false;
}
StringBuilder builder = new StringBuilder();
for (int i = start; i < end; i++) {
char currentChar = source.charAt(i);
if (Character.isLetterOrDigit(currentChar) || currentChar == '{') {
builder.append(currentChar);
canEnterSpace = false;
}
if(Character.isWhitespace(currentChar) && canEnterSpace) {
builder.append(currentChar);
}
}
return builder.toString();
}
};
_edtUsername.setFilters(new InputFilter[]{filter});
_edtFirstName.setFilters(new InputFilter[]{filter});
_edtLastName.setFilters(new InputFilter[]{filter});
但这适用于XML中的所有EditText。
InputFilter=新的InputFilter(){
布尔CAnterSpace=false;
公共CharSequence筛选器(CharSequence源、int开始、int结束、,
跨越目的地、内部数据起点、内部数据起点){
if(_edtUsername.getText().toString()等于(“”)
{
canInterspace=false;
}
StringBuilder=新的StringBuilder();
对于(inti=start;i
谢谢这里我用“.com替换为”
Xml:
这对你有帮助吗?@Niaz,你试过正则表达式吗?Luksprog,正如我所说的,如果我在afterTextChanged块中更改editText(如你提到的例子),我会得到“stackoverflow”。是的。它只是在editable to space中替换字符。但是如果我将“{”替换为“”,然后我得到了backspaceGödel77的奇怪行为,我无法理解关于常规表达式的想法。我已经用我链接的代码运行了一些测试,它可以工作,它不允许您输入“{
字符(我也没有任何异常,无论我输入字符有多快,删除过程都可以工作)。唯一的更改是转义{
,因为它将在常规异常中使用,所以它将不是“{”而是“\\{”。谢谢,我知道这样的解决方案,但它不适用于其他(英语除外)语言。可能UTF8字符适用于其他语言的digit=“…”,但排除两个字符要比设置所有可用的字符集舒服得多。幸运的是,editText的长度仍然是无限的,并且在键入abcd{{{{{{{{{{{{{{{{{{{{{{}后,backspace不会删除dbca,但只有这些不可见的字符{{{{{{{某个地方…你还在第一个和第二个代码中使用TextWatcher吗?你已经注释了editName.setFilters(新的InputFilter[]{filterName});第三个代码吗?哦,是的。我现在已经注释了。editText的最大长度是可以的,但奇怪的退格仍然存在。坦白说,如果我替换“{”有了空间,一切都没问题,但增加了额外的空间…坏消息是,您代码中的array.copyOf在Android 2.2上不起作用。但我的目标是为所有Android版本编写一个应用程序。。。。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.edittextdemo.MainActivity" >
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
public class MainActivity extends Activity {
private EditText edt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edt = (EditText) findViewById(R.id.edt);
edt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
String currentStr = s.toString().replaceAll(".com", "");
if (!s.toString().equals(currentStr)) {
edt.setText(currentStr);
edt.setSelection(currentStr.length());
}
}
});
}