Большинство реализаций text
inputType (кроме URI, пароля и т.д.) для EditText и TextView позволяют Emoji - хотя в большинстве конфигураций клавиатуры Google эта кнопка скрыта. Есть ли способ отключить Emoji от ввода в EditText? Есть ли параметр inputType, который может быть сопряжен с textMultiLine
, который отключит Emoji?
Как отключить emoji от ввода в Android EditText?
Ответ 1
Измените файл build.gradle, добавьте XEditText в свой проект:
dependencies{
compile 'com.xw.repo:xedittext:[email protected]'
}
после этого в вашем 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"/>
Или же:
Настройте 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;
}
}
}
Оба будут хорошо работать!
Ответ 2
Существует сложный способ отключения emoji с клавиатуры.
вам просто нужно установить
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" />
Я не уверен, что он будет работать во всех случаях, но в моем случае это сработало для меня...
Ответ 3
В файле xml для EditText имеется значение digits
. Вы можете установить там все приемлемые символы.
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:digits="qwertyuiopasdfghjklzxcvbnm 1234567890 QWERTYUIOPASDFGHJKLZXCVBNM" />
Я знаю, это не лучшее решение, но работает:)
Ответ 4
Код из @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;
}
}
}
Ответ 5
Вы можете написать фильтр ввода для символов "черный список/белый список"
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 = "[^[email protected]#\\$%\\&\\-\\+\\(\\)\\*;:!\\?\\~`£\\{\\}\\[\\]=\\.,_/\\\\\\s'\\\"<>\\^\\|÷×]";
return source.toString()
.replaceAll(notAllowedCharactersRegex, "");
}
};
}
Затем установите его как фильтры EditText;
InputFilter[] filterArray = new InputFilter[] {getEditTextFilterEmoji()}
editText.setFilters(filterArray);
Ответ 6
Нет ничего, что на 100% отключит эмози. Клавиатура может действовать в любом режиме, который она видит, каким бы способом она ни считалась, поэтому нет настроек, которые предотвратят эмози. Если вы должны предотвратить это, сделайте это белым или черным списком символов с помощью TextWatcher.
Ответ 7
Добавьте этот класс фильтра Emoji:
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};
}
}
И чтобы отключить эмодзи в редактировании текста, сделайте это:
etParkingInstruction.setFilters(EmojiFilter.getFilter());
Были некоторые смайлики, которые можно было набрать, поэтому я добавил:
type==Character.NON_SPACING_MARK || type==Character.OTHER_SYMBOL
в условии if.
Ответ 8
Вы можете использовать входной фильтр для удаления ненужных символов, здесь я использовал ascci значения для фильтрации.
public class CustomEditText extends AppCompatEditText {
private InputFilter unwantedCharacterFilter;
public CustomEditText(Context context) {
super(context);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void init() {
setFilters(new InputFilter[]{});
}
private InputFilter getUnwantedCharacterFilter() {
if (null == unwantedCharacterFilter) {
unwantedCharacterFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (!TextUtils.isEmpty(source)) {
for (int index = start; index < end; index++) {
if (source.charAt(index) < 0 || source.charAt(index) > 177) {
return "";
}
}
}
return null;
}
};
}
return unwantedCharacterFilter;
}
@Override
public void setFilters(InputFilter[] filters) {
List<InputFilter> filterList = new ArrayList<>(Arrays.asList(filters));
filterList.add(getUnwantedCharacterFilter());
InputFilter specifiedFilters[] = filterList.toArray(new InputFilter[]{});
super.setFilters(specifiedFilters);
}
}
Ответ 9
Другое решение:
mEtMessageText.setInputType( InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
В этом примере отображается кнопка ENTER
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS эквивалентен android: inputType = "textEmailAddress" в XML-макете
Ответ 10
Попробуйте android:inputtype="textUri|textMultiLine"
.
В этом параметре клавиатура изменит кнопку голосового ввода на кнопку "/".