如何通过android中的软键盘以编程方式将我的EditText输入限制为某些特殊字符,如反斜杠(/)、平铺(~)等
我正在开发一个键盘应用程序,但我遇到了一个问题。 我想以编程方式限制/阻止android中EditText软键盘中的某些特殊字符 那么,有没有办法限制android中编辑文本中的任何特殊字符输入 如果有人有想法,请回复 提前感谢。检查显示如何限制Android EditText字段中的特殊字符的链接? 试试这个代码如何通过android中的软键盘以编程方式将我的EditText输入限制为某些特殊字符,如反斜杠(/)、平铺(~)等,android,android-edittext,character,android-softkeyboard,Android,Android Edittext,Character,Android Softkeyboard,我正在开发一个键盘应用程序,但我遇到了一个问题。 我想以编程方式限制/阻止android中EditText软键盘中的某些特殊字符 那么,有没有办法限制android中编辑文本中的任何特殊字符输入 如果有人有想法,请回复 提前感谢。检查显示如何限制Android EditText字段中的特殊字符的链接? 试试这个代码 android:digits=“abcde…..012345789”我想这是最简单的方法。希望这对您有所帮助。您可以创建正则表达式并在onTextChanged方法上检查它 your
android:digits=“abcde…..012345789”
我想这是最简单的方法。希望这对您有所帮助。您可以创建正则表达式并在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) {}
});
这应该起作用:
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});
InputFilter过滤器=新的InputFilter(){
公共CharSequence筛选器(CharSequence源、int开始、int结束、,
跨越目的地,起始点,终止点){
对于(inti=start;i
或者,如果您喜欢简单的方式:
<EditText android:inputType="text" android:digits="0123456789*,qwertzuiopasdfghjklyxcvbnm" />
试试这可能对你有用
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 });
}
}
虽然很晚了,但对其他人可能有帮助。 您可以使用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"/>
如果要添加空格,可以在最后一位数字后面加空格
android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "
对于那些在添加空格时可能遇到问题的人,请在空格中添加所有字母。下面是一个例子 您还应该知道,在这种情况下,用户将无法添加新行
<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" />
首先需要添加允许字符的DigitKeyListener,然后将RawInputType设置为edittext字段
edit_field.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
edit_field.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
您可以防止键入特殊字符:
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) {}
});
不幸的是,公认的解决方案并非在所有情况下都有效。正确的解决方案是使用以下
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
}
};
此解决方案不同于公认的解决方案,因为它解决了以下问题:
- 只有源的子序列是替换,而不是完整源
- 源代码不一定只包含新键入的文本,有时它是迄今为止键入的全文