如何在Android程序中通过软键盘将EditText输入限制为某些特殊字符,例如反斜杠(/)、波浪号(~)等。

81
我正在开发一个键盘应用程序,但出现了问题。我想通过编程的方式在Android EditText中限制/阻止软键盘输入一些特殊字符。所以,请问有没有办法实现这个功能?

android:digits="~/#^|" - Phantômaxx
你想限制哪些特殊字符? - Biraj Zalavadia
15个回答

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

这个解决方案与被接受的方案不同之处在于它解决了以下问题:
  • 只有源的一个子序列是替换,而不是全部源
  • 源不一定只包括新输入的文本,有时是到目前为止完整的文本

0
这个答案的 Kotlin 版本
class NameActivity : AppCompatActivity() {

  var myFilter = InputFilter { source, _, _, _, _, _ ->
        try {
            val c = source[0]
            return@InputFilter if (Character.isLetterOrDigit(c)  || c == '_' || c == '.' || c == ' ')
                c.toString()
            else
                ""
        } 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))
    }

}

请问您能分享Jetpack Compose的内容吗? - kgsharathkumar

0

这对我来说是有效的...

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

用于空格的代码:

\u0020

换行请使用:

\n

使用以下选项进行输入法设置:

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

希望它对你有用...

0
可以通过使用“过滤器”来解决,即:
val regex = Regex("^[~#^|$%&*!]*$")
val filter = InputFilter { source, _, _, _, _, _ ->
    return@InputFilter when {
        source?.matches(regex) == true -> ""
        else -> null
    }
}
editText.filters = arrayOf(filter)

对于处理复制-粘贴文本的情况,可以通过添加条件来检查输入的文本是否大于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)

0
这很简单,可以限制EditText中的虚拟输入的任何键。我们可以通过XML或JAVA/Kotlin来实现。以下是使用XML的代码:
    <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPersonName"
                    android:digits="abcdefghijklmnopqrstuvwxyzA BCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n\u0020"
                    android:singleLine="true"
                    android:textColor="@color/black" />

上述代码用于限制姓名字段中的所有特殊字符。 我们展示另一个描述/消息/反馈的例子。
 <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                     android:inputType="textMultiLine"
                     android:digits=".,?:/abcdefghijklmnopqrstuvwxyzA BCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\n\u0020"
                    android:singleLine="false"
                    android:textColor="@color/black" />

那意味着只需添加包含的数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接