textemailaddress - input type password android
¿Cómo deshabilitar la entrada de emoji en Android EditText? (8)
La mayoría de las implementaciones del text
inputType (que no sea URI, contraseña, etc.) para EditText y TextView permiten Emoji, aunque en la mayoría de las configuraciones de teclado de Google este botón está oculto. ¿Hay alguna manera de deshabilitar la entrada de Emoji en un EditText? ¿Hay algún parámetro inputType que pueda emparejarse con textMultiLine
que deshabilite Emoji?
El código de @woxingxiao funciona muy bien, hasta que especifique un inputType en su xml, por ejemplo, android:inputType="textMultiLine"
.
Cambié un poco su propuesta y creo que funciona muy bien.
public class EmojiExcludeEditText extends EditText {
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() {
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 EmojiExcludeFilter emojiExcludeFilter = 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;
}
}
}
Hay digits
valor disponibles en el archivo xml para EditText. Puede establecer allí todos los caracteres aceptables.
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:digits="qwertyuiopasdfghjklzxcvbnm 1234567890 QWERTYUIOPASDFGHJKLZXCVBNM" />
Lo sé, no es la mejor solución pero funciona :)
Hay una manera difícil de deshabilitar emoji desde el teclado.
solo tienes que configurar
android:inputType="textEmailAddress"
para 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" />
No estoy seguro de que funcionará en todos los casos, pero en mi caso funcionó para mí ...
Modifique el archivo build.gradle , agregue XEditText a su proyecto:
dependencies{
compile ''com.xw.repo:xedittext:2.0.0@aar''
}
Después de eso, en tu 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"/>
O:
Personaliza EditText de esta manera:
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;
}
}
}
¡Ambos funcionarán bien!
No hay nada que 100% deshabilitará emoji. El teclado puede actuar en cualquier modo que vea de la manera que crea mejor, de modo que no hay ningún ajuste que evite el emoji. Si debe evitarlo, hágalo mediante caracteres de lista blanca o negra con un TextWatcher.
Otra solución:
mEtMessageText.setInputType ( InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
En este ejemplo se muestra el botón ENTER.
InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS es equivalente a android: inputType = " textEmailAddress " en el diseño XML
Pruebe android:inputtype="textUri|textMultiLine"
.
En este parámetro, el teclado cambiará el botón de entrada de voz al botón ''/''.
Puede escribir un filtro de entrada para los caracteres de lista negra / lista blanca
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, "");
}
};
}
Luego configúralo como filtros EditText;
InputFilter[] filterArray = new InputFilter[] {getEditTextFilterEmoji()}
editText.setFilters(filterArray);