如何在我的程序设计中通过软键盘将我的EditText输入限制为某些特殊字符,如反斜杠(/),tild(〜)等

时间:2014-02-17 11:50:04

标签: android android-edittext character android-softkeyboard

我正在开发一个键盘应用程序,但我正在解决一个问题。 我想以编程方式在Android中的EditText中限制/阻止软键盘中的某些特殊字符。

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

如果有人有意,请回复。

提前致谢。

11 个答案:

答案 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))
    }

}