Qua*_*ddd 43 keyboard android emoji
textEditText和TextView 的inputType的大多数实现(除了URI,密码等)都允许表情符号 - 尽管在大多数Google键盘配置中,此按钮是隐藏的.有没有办法禁止在EditText中输入表情符号?是否有一个inputType参数可以与textMultiLine禁用表情符号配对?
wox*_*iao 24
修改build.gradle文件,将XEditText添加到项目中:
dependencies{
compile 'com.xw.repo:xedittext:2.0.0@aar'
}
Run Code Online (Sandbox Code Playgroud)
之后,在layout.xml中:
<com.xw.repo.XEditText
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:x_disableEmoji="true"/>
Run Code Online (Sandbox Code Playgroud)
像这样自定义EditText:
public class CustomEditText extends EditText {
public CustomEditText(Context context) {
super(context);
init();
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
两者都会运作良好!
Pra*_* シ 20
从键盘禁用表情符号有一些棘手的方法..
你只需要设置
android:inputType="textEmailAddress"
为EditText......
<EditText
android:id="@+id/edt_note"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/note"
android:inputType="textEmailAddress"
android:padding="10dp"
android:textColor="@color/white" />
Run Code Online (Sandbox Code Playgroud)
我不确定它是否适用于所有情况但在我的情况下它对我有用...
Adr*_*tis 17
digitsEditText的xml文件中有值.你可以设置所有可接受的字符.
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:digits="qwertyuiopasdfghjklzxcvbnm 1234567890 QWERTYUIOPASDFGHJKLZXCVBNM" />
Run Code Online (Sandbox Code Playgroud)
我知道,这不是最好的解决方案,但有效:)
添加此表情符号过滤器类:
public class EmojiFilter {
public static InputFilter[] getFilter()
{
InputFilter EMOJI_FILTER = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int index = start; index < end; index++) {
int type = Character.getType(source.charAt(index));
if (type == Character.SURROGATE || type==Character.NON_SPACING_MARK
|| type==Character.OTHER_SYMBOL) {
return "";
}
}
return null;
}
};
return new InputFilter[]{EMOJI_FILTER};
}
}
Run Code Online (Sandbox Code Playgroud)
要在编辑文本中禁用表情符号,请执行以下操作:
editText.setFilters(EmojiFilter.getFilter());
Run Code Online (Sandbox Code Playgroud)
有一些表情符号可以输入,所以我补充说:
type==Character.NON_SPACING_MARK || type==Character.OTHER_SYMBOL
Run Code Online (Sandbox Code Playgroud)
在 if 条件下。
我为此目的制作了 Kotlin 扩展。它还可以防止复制粘贴表情符号。
扩大:
fun EditText.filterEmoji() {
filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
source.filter { Character.getType(it) != Character.SURROGATE.toInt() && Character.getType(it) != Character.OTHER_SYMBOL.toInt() }
})
}
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 类中:
editText.filterEmoji()
Run Code Online (Sandbox Code Playgroud)
就是这样。享受!
@woxingxiao中的代码很有用,直到你在xml中指定任何inputType为止android:inputType="textMultiLine".
我改变了一点他的提议,我觉得它很有效.
public class EmojiExcludeEditText extends EditText {
private EmojiExcludeFilter emojiExcludeFilter;
public EmojiExcludeEditText(Context context) {
super(context);
init();
}
public EmojiExcludeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EmojiExcludeEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
if (emojiExcludeFilter == null) {
emojiExcludeFilter = new EmojiExcludeFilter();
}
setFilters(new InputFilter[]{emojiExcludeFilter});
}
@Override
public void setFilters(InputFilter[] filters) {
if (filters.length != 0) { //if length == 0 it will here return when init() is called
boolean add = true;
for (InputFilter inputFilter : filters) {
if (inputFilter == emojiExcludeFilter) {
add = false;
break;
}
}
if (add) {
filters = Arrays.copyOf(filters, filters.length + 1);
filters[filters.length - 1] = emojiExcludeFilter;
}
}
super.setFilters(filters);
}
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以为黑名单/白名单字符编写输入过滤器
public static InputFilter getEditTextFilterEmoji()
{
return new InputFilter()
{
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
CharSequence sourceOriginal = source;
source = replaceEmoji(source);
end = source.toString().length();
if (end == 0) return ""; //Return empty string if the input character is already removed
if (! sourceOriginal.toString().equals(source.toString()))
{
char[] v = new char[end - start];
TextUtils.getChars(source, start, end, v, 0);
String s = new String(v);
if (source instanceof Spanned)
{
SpannableString sp = new SpannableString(s);
TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
return sp;
}
else
{
return s;
}
}
else
{
return null; // keep original
}
}
private String replaceEmoji(CharSequence source)
{
String notAllowedCharactersRegex = "[^a-zA-Z0-9@#\\$%\\&\\-\\+\\(\\)\\*;:!\\?\\~`£\\{\\}\\[\\]=\\.,_/\\\\\\s'\\\"<>\\^\\|÷×]";
return source.toString()
.replaceAll(notAllowedCharactersRegex, "");
}
};
}
Run Code Online (Sandbox Code Playgroud)
然后将其设置为EditText过滤器;
InputFilter[] filterArray = new InputFilter[] {getEditTextFilterEmoji()}
editText.setFilters(filterArray);
Run Code Online (Sandbox Code Playgroud)
没有什么可以 100% 禁用表情符号。键盘可以以它认为最好的任何方式在它看到的任何模式下运行,因此没有任何设置可以阻止表情符号。如果您必须阻止它,请使用 TextWatcher 将字符列入白名单或黑名单。
小智 -4
尝试android:inputtype="textUri|textMultiLine"。
在此参数中,键盘会将语音输入按钮更改为“/”按钮。
| 归档时间: |
|
| 查看次数: |
30137 次 |
| 最近记录: |