如何通过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中EditText软键盘中的某些特殊字符

那么,有没有办法限制android中编辑文本中的任何特殊字符输入

如果有人有想法,请回复

提前感谢。

检查显示如何限制Android EditText字段中的特殊字符的链接?

试试这个代码
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
    }
};
此解决方案不同于公认的解决方案,因为它解决了以下问题:

  • 只有源的子序列是替换,而不是完整源
  • 源代码不一定只包含新键入的文本,有时它是迄今为止键入的全文

android:digits=“~/\\\\\^^”您要限制哪些特殊字符;谢谢回复。我正在测试,然后返回给您。它工作正常,但我需要更多帮助。如何重新设置货币符号,如、€等。在blockCharacterSet中添加要限制的字符@jagdish@Sanket990你可以用\为此,用户仍然能够将这些无效字符粘贴到EddiTeX解决方案中,以对每个字符进行检查循环,如这里所示:它阻止单引号和双引号,实际上,如果您在最后一个数字中添加空间,则不必指定COMMA。如果你想给空格,那么在数字或字母之间给空格。不要在结尾和开头给出它。@tara你可以用双引号(“”)把任何地方都加上。这对我很有用。这对我很有帮助,因为它可以和浆糊一起使用