web-dev-qa-db-fra.com

Comment désactiver la saisie des emoji dans Android EditText?

La plupart des implémentations du text inputType (autre que l'URI, le mot de passe, etc.) pour EditText et TextView autorisent Emoji - bien que dans la plupart des configurations de clavier Google, ce bouton soit masqué. Existe-t-il un moyen de désactiver la saisie d'Emoji dans un EditText? Existe-t-il un paramètre inputType qui pourrait être associé à textMultiLine qui désactiverait Emoji?

41
Quadddd

Modifiez le fichier build.gradle , ajoutez XEditText à votre projet:

dependencies{
    compile 'com.xw.repo:xedittext:2.0.0@aar'
}

après cela, dans votre 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"/>

Ou:

Personnalisez EditText comme ceci:

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

Les deux fonctionneront bien!

25
woxingxiao

Il existe un moyen délicat de désactiver les emoji du clavier.

il suffit de régler

Android:inputType="textEmailAddress"

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

Je ne suis pas sûr que cela fonctionnera dans tous les cas mais dans mon cas cela a fonctionné pour moi ...

20
Pragnesh Ghoda シ

Il existe une valeur digits disponible dans le fichier xml pour EditText. Vous pouvez y définir tous les caractères acceptables.

<EditText
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:digits="qwertyuiopasdfghjklzxcvbnm 1234567890 QWERTYUIOPASDFGHJKLZXCVBNM" />

Je sais, ce n'est pas la meilleure solution mais ça marche :)

15
Adrian Grygutis

Le code de @woxingxiao fonctionne très bien, jusqu'à ce que vous spécifiiez un inputType dans votre xml, par exemple Android:inputType="textMultiLine".

J'ai changé un peu sa proposition et je pense que cela fonctionne très bien.

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

Vous pouvez écrire un filtre d'entrée pour les caractères de liste noire/liste blanche

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, "");
        }

    };
}

Ensuite, définissez-le comme filtres EditText;

InputFilter[] filterArray = new InputFilter[] {getEditTextFilterEmoji()}
editText.setFilters(filterArray);
6
erandac

Il n'y a rien qui désactivera à 100% les emoji. Le clavier peut agir dans n'importe quel mode qu'il voit de la manière qui lui convient le mieux, il n'y a donc aucun paramètre qui empêchera les emoji. Si vous devez l'empêcher, faites-le par des caractères de liste blanche ou noire avec un TextWatcher.

4
Gabe Sechan

Ajoutez cette classe de filtre 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};
    }
}

Et pour désactiver les emoji dans le texte d'édition, procédez comme suit:

etParkingInstruction.setFilters(EmojiFilter.getFilter());

Il y avait des emoji qui étaient capables de taper alors j'ai ajouté:

type==Character.NON_SPACING_MARK || type==Character.OTHER_SYMBOL

dans la condition if.

1
Suraj Vaishnav

Vous pouvez utiliser un filtre d'entrée pour supprimer les caractères indésirables, ici j'ai utilisé des valeurs ascii pour le filtrage.

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

}

0
user2851150