Editext禁止输入Emoji表情
直接内部类使用用一个监听搞定
package com.warden.snsemoji;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
{
private static final String TAG = "warden";
private EditText mainEt;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainEt = (EditText) findViewById(R.id.main_et);
mainEt.addTextChangedListener(new TextChange(mainEt));
}
private class TextChange implements TextWatcher
{
private EditText et;
public TextChange(EditText et)
{
this.et = et;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
CharSequence input = s.subSequence(start, start + count);
if (count == 0) return;
if (isEmojiCharacter(input))
{
show("not input emoji");
et.setText(removeEmoji(s));
}
if (s.length() > 3)
{
show("超过输入的最大限制");
et.setText(s.subSequence(0, start));
}
et.setSelection(et.getText().toString().length());
}
@Override
public void afterTextChanged(Editable s)
{
}
}
/**
* 去除字符串中的Emoji表情
* @param source
* @return
*/
private String removeEmoji(CharSequence source)
{
String result = "";
for (int i = 0; i < source.length(); i++)
{
char c = source.charAt(i);
if (isEmojiCharacter(c))
{
continue;
}
result += c;
}
return result;
}
/**
* 判断一个字符串中是否包含有Emoji表情
* @param input
* @return true 有Emoji
*/
private boolean isEmojiCharacter(CharSequence input)
{
for (int i = 0; i < input.length(); i++)
{
if (isEmojiCharacter(input.charAt(i)))
{
return true;
}
}
return false;
}
/**
* 是否是Emoji 表情,抄的那哥们的代码
*
* @param codePoint
* @return true 是Emoji表情
*/
public static boolean isEmojiCharacter(char codePoint)
{
boolean isScopeOf = (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF) && (codePoint != 0x263a))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
return !isScopeOf;
}
private void show(String msg)
{
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
void e(String msg)
{
Log.e(TAG, msg);
}
void i(String msg)
{
Log.i(TAG, msg);
}
void d(String msg)
{
Log.d(TAG, msg);
}
}