如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符

Posted

技术标签:

【中文标题】如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符【英文标题】:How can restrict my EditText input to some special character like backslash(/),tild(~) etc by soft keyboard in android programmatically 【发布时间】:2014-03-16 16:54:15 【问题描述】:

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

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

如果有人有想法,请回复。

提前致谢。

【问题讨论】:

android:digits="~/\#^|" 您要限制哪些特殊字符; 感谢您的回复。我正在测试,然后回复您。 【参考方案1】:

试试这个可能对你有用

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 );
    


【讨论】:

它工作正常,但我需要更多帮助。如何重新设置货币符号,如 £、€ 等。 在 blockCharacterSet @jagdish 中添加要限制的字符 @Sanket990 你可以使用 \" 。 用户仍然可以将这些无效字符粘贴到编辑文本中 解决方案是对每个字符进行循环检查,如下所示:***.com/a/7335559/1235910【参考方案2】:

如果你想添加空格,你可以在最后一个数字后面加空格。

  android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "

【讨论】:

如果您在最后一位添加空格,则不会考虑。如果你想给空间,那么在数字或字母之间给它。不要给它,最后和开始。 @tara 你可以在任何地方加上双引号(“”)。这对我有用。【参考方案3】:

这应该可行:

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" />

【讨论】:

其实你不必指定逗号【参考方案4】:

查看this 链接,该链接显示如何限制 Android EditText 字段中的特殊字符?

试试这个代码 android:digits="abcde.....012345789" 我想这是最简单的方法。希望对您有所帮助。

【讨论】:

它阻止单引号和双引号,空格【参考方案5】:

它已经晚了,但可能对其他人有帮助。 您可以使用 xml 属性而不是编程方式。可能的情况是,在单一布局中,您有许多 editText,您希望将特殊字符限制在一个 EditText 中。所以在 xml 中定义会帮助你。这是通过允许特殊字符只输入字母和数字来限制特殊字符的代码,如下所示

<EditText
     android:id="@+id/editText"
     android:layout_
     android:layout_
     android:textSize="@dimen/text10"
     android:singleLine="true"
     android:maxLines="1"
     android:maxLength="16"
     android:digits="abcdefghijklmnopqrstuvwxyz0123456789"/>

【讨论】:

【参考方案6】:

对于那些在添加空间时可能遇到问题的人,请添加一个包含所有字母的空格。下面是一个例子 此外,您应该知道在这种情况下用户将无法添加新行。

            <EditText
            android:layout_
            android:layout_
            android:inputType="text"
            android:digits="0123456789,a bcdefghijklmnopqrstuvwxyz"
            android:maxLines="1"
            android:singleLine="true" />

【讨论】:

【参考方案7】:

首先需要添加允许字符的DigitsKeyListener,然后setRawInputType到edittext字段

edit_field.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));


edit_field.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);

【讨论】:

这对我有帮助,因为它适用于粘贴【参考方案8】:

您可以创建正则表达式并在 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) 
       );

【讨论】:

【参考方案9】:

您可以防止输入特殊字符:

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) 
   );

【讨论】:

【参考方案10】:

不幸的是,接受的解决方案并非在所有情况下都有效。正确的解决方案是使用以下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
    
;

此解决方案与公认的解决方案不同之处在于它解决了以下问题:

只有源的子序列是替换,而不是完整的源 来源不一定只包括新输入的文本,有时它是迄今为止输入的全文

【讨论】:

【参考方案11】:

这个答案的 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))
    


【讨论】:

【参考方案12】:

这对我有用...

android:digits="÷×=%_-+#().,abcdefghijklmnopqrstuvwxyzA BCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n\u0020"

空间使用:

\u0020

换行:

\n

对于 ime 选项使用:

android:singleLine="true"
android:maxLines="1"

希望它对你有用...

【讨论】:

【参考方案13】:

接受的答案仍然允许用户粘贴不需要的字符。此解决方案有效:


您所要做的就是:

List<String> unwantedChars = new ArrayList<>(Arrays.asList("@", "€"));
editText.addTextChangedListener(new FilterUnwantedChars(editText, unwantedChars));

助手类:

public class FilterUnwantedChars implements TextWatcher 

    private List<String> unwantedChars;
    private EditText editText;

    private boolean listenToTextChange;

    public FilterUnwantedChars(EditText editText, List<String> unwantedChars) 
        this.unwantedChars = unwantedChars;
        this.editText = editText;
        this.listenToTextChange = true;
    

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)  

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) 
        if (!listenToTextChange) 
            listenToTextChange = true;
            return;
        

        String result = s.toString();
        final String oldString = result;
        for (String unwanted : unwantedChars) 
            result = result.replace(unwanted, "");
        

        if (!oldString.equals(result)) 
            listenToTextChange = false;
            int currentPos = editText.getSelectionStart()-1;
            editText.setText(result);

            try 
                editText.setSelection(currentPos);
             catch (Exception e) 
                // nothing
            
        
    

    @Override
    public void afterTextChanged(Editable s)  

    public void setEditText(EditText editText) 
        this.editText = editText;
    

    public EditText getEditText() 
        return editText;
    

    public List<String> getUnwantedChars() 
        return unwantedChars;
    

    public void setUnwantedChars(List<String> unwantedChars) 
        this.unwantedChars = unwantedChars;
    


【讨论】:

【参考方案14】:

可以使用filters解决,即

val regex = Regex("^[~#^|$%&*!]*$")
val filter = InputFilter  source, _, _, _, _, _ ->
    return@InputFilter when 
        source?.matches(regex) == true -> ""
        else -> null
    

editText.filters = arrayOf(filter)

对于处理copy-pasted 文本,可以通过添加条件来检查输入的文本是否大于1,现在看起来像这样

val regex = Regex("^[~#^|$%&*!]*$")
val filter = InputFilter  source, _, _, _, _, _ ->
    return@InputFilter when 
        source?.matches(regex) == true -> ""
        source.length > 1 -> source.trim  it.toString().matches(regex)  // Put your desired logic here, these sample logic was doing a trim/remove
        else -> null
    

editText.filters = arrayOf(filter)

【讨论】:

以上是关于如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将我的 android 应用程序锁定为纵向/横向模式?

以编程方式将我的应用程序添加到 android 中的 AutoStart 应用程序列表

如何以编程方式使用 android studio 4.2.1 将我的应用程序图标设置为一个信号通知

关于Android中的软键盘

如何以编程方式重命名 Android 应用程序?

如何在 Android TV 上显示带有数字和符号的软键盘?