web-dev-qa-db-ja.com

Android EditText?に絵文字が入力されないようにする方法は?

EditTextおよびTextViewのtext inputType(URI、パスワードなどを除く)のほとんどの実装では、絵文字を使用できます-ほとんどのGoogleキーボード構成では、このボタンは非表示になっています。 EditTextで絵文字の入力を無効にする方法はありますか?絵文字を無効にするtextMultiLineと組み合わせることができるinputTypeパラメーターはありますか?

41
Quadddd

build.gradleファイルを変更し、プロジェクトに XEditText を追加します。

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

その後、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;
        }
    }
}

両方ともうまくいきます!

25
woxingxiao

キーボードから絵文字を無効にするのは難しい方法があります。

あなただけを設定する必要があります

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

すべてのケースで機能するかどうかはわかりませんが、私の場合はうまくいきました...

20

EditTextのxmlファイルにはdigitsの値があります。使用可能なすべての文字をそこに設定できます。

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

私は知っている、それは最良の解決策ではありませんが、動作します:)

15
Adrian Grygutis

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

ブラックリスト/ホワイトリスト文字の入力フィルターを書くことができます

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

    };
}

次に、それをEditTextフィルターとして設定します。

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

絵文字を100%無効にするものはありません。キーボードは、考えているどのような方法でも表示されるどのモードでも動作できるため、絵文字を妨げる設定はありません。防止する必要がある場合は、TextWatcherを使用して文字をホワイトリストまたはブラックリストに登録してください。

4
Gabe Sechan

この絵文字フィルタークラスを追加します。

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条件で。

1
Suraj Vaishnav

入力フィルターを使用して不要な文字を削除できます。ここでは、フィルタリングにascii値を使用しました。

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