Android開(kāi)發(fā)中EditText禁止輸入Emoji表情符

在開(kāi)發(fā)中可能多處會(huì)用到過(guò)濾Emoji表情符,一般情況下,我們會(huì)通過(guò)EditText的addTextChangedListener()監(jiān)聽(tīng)來(lái)過(guò)濾Emoji表情,但在實(shí)際開(kāi)發(fā)中會(huì)遇到多個(gè)EditText,為了方便使用,我們可以自定義EditText來(lái)實(shí)現(xiàn),代碼如下:

package com.piesat.dragonfly.ui.view;

import android.content.Context;

import android.text.Editable;

import android.text.Selection;

import android.text.Spannable;

import android.text.TextWatcher;

import android.util.AttributeSet;

import android.widget.EditText;

import android.widget.Toast;

/**

* @Description EditText限制輸入表情符號(hào)

* @Authour zhoujp

* @Time 2016年11月18日 下午2:09:58

*

*/

public class ContainsEmojiEditText extends EditText {

// 輸入表情前的光標(biāo)位置

private int cursorPos;

// 輸入表情前EditText中的文本

private String inputAfterText;

// 是否重置了EditText的內(nèi)容

private boolean resetText;

private Context mContext;

public ContainsEmojiEditText(Context context) {

super(context);

this.mContext = context;

initEditText();

}

public ContainsEmojiEditText(Context context, AttributeSet attrs) {

super(context, attrs);

this.mContext = context;

initEditText();

}

public ContainsEmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

this.mContext = context;

initEditText();

}

// 初始化edittext 控件

private void initEditText() {

addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int before, int count) {

if (!resetText) {

cursorPos = getSelectionEnd();

// 這里用s.toString()而不直接用s是因?yàn)槿绻胹,

// 那么,inputAfterText和s在內(nèi)存中指向的是同一個(gè)地址,s改變了,

// inputAfterText也就改變了,那么表情過(guò)濾就失敗了

inputAfterText = s.toString();

}

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

if (!resetText) {

if (count >= 2) {// 表情符號(hào)的字符長(zhǎng)度最小為2

CharSequence input = s.subSequence(cursorPos, cursorPos + count);

if (containsEmoji(input.toString())) {

resetText = true;

Toast.makeText(mContext, "不支持輸入表情符號(hào)!", Toast.LENGTH_SHORT).show();

// 是表情符號(hào)就將文本還原為輸入表情符號(hào)之前的內(nèi)容

setText(inputAfterText);

CharSequence text = getText();

if (text instanceof Spannable) {

Spannable spanText = (Spannable) text;

Selection.setSelection(spanText, text.length());

}

}

}

} else {

resetText = false;

}

}

@Override

public void afterTextChanged(Editable editable) {

}

});

}

/**

* 檢測(cè)是否有emoji表情

*

* @param source

* @return

*/

public static boolean containsEmoji(String source) {

int len = source.length();

for (int i = 0; i < len; i++) {

char codePoint = source.charAt(i);

if (!isEmojiCharacter(codePoint)) { // 如果不能匹配,則該字符是Emoji表情

return true;

}

}

return false;

}

/**

* 判斷是否是Emoji

*

* @param codePoint

*? ? ? ? ? ? 比較的單個(gè)字符

* @return

*/

private static boolean isEmojiCharacter(char codePoint) {

return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)

|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))

|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,836評(píng)論 25 709
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,311評(píng)論 0 17
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,842評(píng)論 2 45
  • 前言 一個(gè)專(zhuān)業(yè)的程序員,怎么能不掌握Git呢?版本控制領(lǐng)域,已經(jīng)發(fā)展了一段時(shí)間,從古老的CVS,到SVN集中式管理...
    張豐哲閱讀 3,287評(píng)論 9 38
  • 鳳凰新聞今天上傳了這樣一則報(bào)道:小攀的母親為了多掙點(diǎn)錢(qián)補(bǔ)貼家用,兩個(gè)月前,帶領(lǐng)自己14歲的小攀從湖南老家來(lái)到南海佛...
    墨成閱讀 491評(píng)論 0 1

友情鏈接更多精彩內(nèi)容