我正在开发一个键盘应用程序,但我正在解决一个问题。 我想以编程方式在Android中的EditText中限制/阻止软键盘中的某些特殊字符。
那么,有没有办法可以限制android中编辑文本中的任何特殊字符输入。
如果有人有意,请回复。
提前致谢。
答案 0 :(得分:73)
试试这个可能适合你
public class MainActivity extends Activity {
private EditText editText;
private String blockCharacterSet = "~#^|$%&*!";
private InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText.setFilters(new InputFilter[] { filter });
}
}
答案 1 :(得分:17)
查看显示如何限制Android EditText字段中的特殊字符的this链接?
试试这段代码
android:digits="abcde.....012345789"
我想这是最简单的方法。请帮助你。
答案 2 :(得分:17)
这应该有效:
InputFilter filter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
或者如果您更喜欢简单的方法:
<EditText android:inputType="text" android:digits="0123456789*,qwertzuiopasdfghjklyxcvbnm" />
答案 3 :(得分:16)
如果您想添加空格,可以在最后一位数字后面留出空格。
android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "
答案 4 :(得分:4)
它很晚但可能对其他人有帮助。 而不是programaticaly,你可以使用xml属性。可能是在单一布局中你有很多editText,你只想在一个EditText中限制特殊字符。所以在xml中定义会帮助你。以下是限制特殊字符的代码,允许它们只输入字母和数字,如下所示
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/text10"
android:singleLine="true"
android:maxLines="1"
android:maxLength="16"
android:digits="abcdefghijklmnopqrstuvwxyz0123456789"/>
答案 5 :(得分:3)
对于那些在添加空间时可能遇到问题的人,请添加一个包含所有字母的空白区域。以下是一个例子 此外,您应该知道用户在这种情况下无法添加新行。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:digits="0123456789,a bcdefghijklmnopqrstuvwxyz"
android:maxLines="1"
android:singleLine="true" />
答案 6 :(得分:2)
您可以创建正则表达式并在onTextChanged方法
上进行检查yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// you can call or do what you want with your EditText here
yourEditText. ...
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
答案 7 :(得分:0)
首先需要添加DigitsKeyListener以允许字符,然后将setRawInputType设置为edittext字段
edit_field.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
edit_field.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
答案 8 :(得分:0)
您可以防止输入特殊字符:
yourEditText.addTextChangedListener(new TextWatcher() {
CharSequence previous;
public void afterTextChanged(Editable s) {
if(s.toString().contains("&^%$#*&(")){
s.clear();
s.append(previous.toString());
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
previous = s;
}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
答案 9 :(得分:0)
不幸的是,并非在所有情况下都接受公认的解决方案。正确的解决方案是使用以下InputFilter
:
private InputFilter filter = new InputFilter() {
// An example pattern that restricts the input only to the lowercase letters
private static final Pattern restrictedChars = Pattern.compile("[a-z]*")
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
final CharSequence replacementText = source.subSequence(start, end);
final CharSequence replacedText = dest.subSequence(dstart, dend);
if (source == null || restrictedChars.matcher(replacementText).matches()) {
return null; // Accept the original replacement
}
return replacedText; // Keep the original text
}
};
此解决方案不同于公认的解决方案,它解决了以下问题:
答案 10 :(得分:0)
这个答案的 kotlin 版本
class NameActivity : AppCompatActivity() {
var myFilter =
InputFilter { source, _, _, _, _, _ ->
try {
val c = source[0]
return@InputFilter if (Character.isLetterOrDigit(c) || c == '_' || c == '.') {
"$c"
} else {
// here you can show error msg
""
}
} catch (e: Exception) {
}
null
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_name)
val edittext = findViewById<EditText>(R.id.edittext)
edittext.filters = (arrayOf(myFilter))
}
}