我想以编程方式从键盘隐藏表情符号和自动建议。它适用于某些 Android 设备,但不适用于所有设备。这是我隐藏自动建议的代码:
txtSingupemail.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
txtSignuppwd.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
txtSignuppwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
这是我的用户界面的快照:
这是用户点击登录按钮时的布局。当用户点击左下角标记为红色的图标时,由于表情符号作为建议,键盘高度会增加。
见下图:
有没有办法以编程方式从键盘隐藏那些顶级表情符号?
试试这个对我有用
editText.setFilters(new InputFilter[]{new EmojiExcludeFilter()});
private class EmojiExcludeFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
int type = Character.getType(source.charAt(i));
if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
return "";
}
}
return null;
}
}
Android 有数百(如果不是数千)输入法编辑器(又名软键盘)。
无需提供表情符号。欢迎那些这样做的人随时提供他们想要的东西。
输入法编辑器无需遵守您放置在EditText
上的
any标志。因此,不需要输入法编辑器提供任何阻止表情符号输入的方法。而且,即使有些人确实提供了这种能力,其他人可能不会,而那些提供这种能力的人可能会通过不同的标志来提供。
键盘上是否有表情符号选项由键盘的开发者和用户(选择使用键盘的人)决定。你没有投票权。
由于 AFAIK 表情符号只是 Unicode 字符,并且由于您应该在其他地方支持 Unicode 字符(例如,中文字形),因此不清楚您必须避免使用表情符号的技术原因是什么。话虽如此,如果您反对表情符号,欢迎您尝试从输入的文本中过滤掉它们(例如,使用
TextWatcher
)。
这可能不是最好的解决方案,但下面的代码对我来说很好用:
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
并且由于密码输入类型更改了字体,您只需为其设置默认字体:
editText.setTypeface(Typeface.DEFAULT);
Android
mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD| TEXT_MULTILINE);
TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - 我们使用密码字符作为 EditTest 的文本输入。它没有表情符号和电子邮件键,如 .com 和 @ 键 TEXT_MULTILINE - 这会将键盘布局按钮 [Done] 或 [->] 更改为 [Enter] 键,因此我们可以使用多行文本或换行功能。
Xamarin 形式
创建一个 CustomRender 并在 OnElementChanged 方法中
protected override void OnElementChanged(ElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.ImeOptions = Android.Views.InputMethods.ImeAction.Done;
Control.InputType = Android.Text.InputTypes.ClassText | Android.Text.InputTypes.TextVariationVisiblePassword| Android.Text.InputTypes.TextFlagMultiLine;
Control.SetTypeface(Typeface.Default, TypefaceStyle.Normal);
}
}
这可能对你有帮助,它将禁用表情符号 android:inputType="textShortMessage" 。如果对您没有帮助,请告诉我
在 Kotlin 中,为 Edittext 添加 Input 过滤器。当快速输入数字和字母时,我遇到了问题。这段代码解决了
editText.filters = editTextAllowAlphabetsSymbols("") // Add any symbols that you wish to allow
然后这个
fun editTextAllowAlphabetsSymbols(symbols:String):Array<InputFilter>{
return arrayOf(AlphabetsSymbolsInputFilter(symbols))
}
最后
class AlphabetsSymbolsInputFilter(symbols:String) : InputFilter {
private var mWordPattern: String
var mLetterPattern:String
init {
mLetterPattern = "[a-zA-Z.$symbols ]"
//mLetterPattern = "[a-zA-Z0-9.$symbols ]" // replace if alphanumeric
mWordPattern = "$mLetterPattern+"
}
override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
if(source == ""){
println("In backspace")
return source
}
if(source.isNotEmpty() && source.toString().matches(mWordPattern.toRegex())){
return source
}
var sourceStr = ""
if(source.isNotEmpty() && !source.toString().matches(mLetterPattern.toRegex())){
sourceStr = source.toString()
while(sourceStr.isNotEmpty() && !sourceStr.matches(mWordPattern.toRegex())){
println(" source --> $source dest ---> $dest")
if(sourceStr.last().isDigit()) {
print("Is digit ")
sourceStr = sourceStr.subSequence(0, sourceStr.length - 1).toString()
}
else if(!sourceStr.last().toString().matches(mLetterPattern.toRegex())) {
print("Is emoji or weird symbols")
sourceStr = sourceStr.subSequence(0, sourceStr.length - 1).toString()
}else
break
}
return sourceStr
}
return source
}
}
Anjali-Systematix 的回答有一个小问题。如果用户在任何文本后键入表情符号而不留任何空格,例如 - “codebase😮”,文本“codebase”也会被删除。这对我有用:
class EditTextForName : AppCompatEditText {
constructor(context: Context) : super(context) {
init()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init()
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
init()
}
private fun init() {
filters = arrayOf(EmojiExcludeFilter())
}
private inner class EmojiExcludeFilter : InputFilter {
override fun filter(
source: CharSequence,
start: Int,
end: Int,
dest: Spanned,
dstart: Int,
dend: Int
): CharSequence? {
for (i in start until end) {
val type = Character.getType(source[i])
if (type == SURROGATE.toInt() || type == OTHER_SYMBOL.toInt()) {
return source.substring(0 until i)
}
}
return null
}
}
}
迄今为止最好的方法,并且在你的 xml 编写中工作得很好 android:digits= "ABCDEFGHIJKLMNOPQRSTUVWXYZqwertyuiopasdfghjklmnbvcxz@.,1234567890"
没有什么可以 100% 禁用表情符号。如果有人使用自定义键盘,您只能隐藏键盘的默认表情,您不能隐藏自定义键盘的表情 也许这会对你有所帮助
editext.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);