missing - Parámetro de diseño Android InputType: ¿cómo permitir decimales negativos?
missing autofill hints attribute android studio (8)
A menos que me falta algo, esto es todo lo que necesitas
android:inputType="numberDecimal|numberSigned"
Tengo un diseño que tiene tres campos para la entrada de tres coordenadas de mapa. Hasta aquí todo bien. Estoy usando android: inputType = "numberDecimal" en el diseño. Al ingresar al campo, el usuario obtiene el teclado numérico. Sigue bien.
Sin embargo, cuando se necesita ingresar una coordenada negativa, no hay forma aparente de hacerlo.
23.2342 funciona bien. 232.3421 funciona bien. -11.23423 no se puede ingresar: no hay forma de ingresar el signo negativo inicial, o incluso ajustar la coordenada en ().
Estoy seguro de que puedo ir por la ruta de cambiar esto a texto recto inputType, y luego usar una expresión regular para validar que lo que se ingresó es de hecho una coordenada numérica, manejar los mensajes de error de vuelta al usuario, etc. Pero hubiera en lugar de ir por esa ruta.
He buscado en Google y Stackoverflowed esta pregunta durante un par de horas sin suerte. ¿Alguna sugerencia?
Creo que crear su propio keylistener personalizado puede ser su mejor opción. Hice algo similar. Creé un SignedDecimalKeyListener como este:
public class SignedDecimalKeyListener extends NumberKeyListener
{
private char[] mAccepted;
private static SignedDecimalKeyListener sInstance;
private static final char[] CHARACTERS = new char[] { ''-'', ''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'', ''.'' };
@Override
protected char[] getAcceptedChars()
{
return mAccepted;
}
private SignedDecimalKeyListener()
{
mAccepted = CHARACTERS;
}
public static SignedDecimalKeyListener getInstance()
{
if(sInstance != null)
return sInstance;
sInstance = new SignedDecimalKeyListener();
return sInstance;
}
public int getInputType()
{
return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
CharSequence out = super.filter(source, start, end, dest, dstart, dend);
if(out != null)
{
source = out;
start = 0;
end = out.length();
}
//Only allow a ''-'' to be the very first char
//and don''t allow ''.'' to be the first char
if(dstart > 0 && source.equals("-") || dstart == 0 && source.equals("."))
{
SpannableStringBuilder stripped = null;
stripped = new SpannableStringBuilder(source, start, end);
stripped.delete(start, end);
if(stripped != null)
return stripped;
}
else if(source.equals("."))
{
for(int lo = dend-1; lo > 0; lo--)
{
char c = dest.charAt(lo);
if(source.equals(String.valueOf(c)))
{
SpannableStringBuilder stripped = null;
stripped = new SpannableStringBuilder(source, start, end);
stripped.delete(start, end);
if(stripped != null)
return stripped;
}
}
}
if(out != null)
return out;
else
return null;
}
}
Y luego usa este keylistener personalizado con tu texto de edición así:
EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());
Esto es trabajo para mí.
etbox.setInputType (InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);
No estoy seguro sobre el tipo de entrada pero siempre puedes crear tu propio filtro de texto y adjuntarlo en un campo editText. ese es bastante simple puedes controlar todos los personajes y solo permitir los números, puntos o cualquier personaje personalizado que desees.
Por favor usa este código
et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);
Terminó usando Pattern y Matcher para cada uno de los ejes, dejando el formato de entrada de texto real abierto.
Tres campos de ejes, enviar botones desencadenantes en Guardar. Los campos se validan y se produce la inserción, o se envía un mensaje de error al remitente sobre el formato requerido para los campos de Ejes. El formato correcto es de 1-3 dígitos, opcionalmente precedido por ''-'', opcionalmente seguido por ''.'' y dígitos adicionales.
Prueba este código:
private View.OnClickListener onSave=new View.OnClickListener(){
public void onClick(View v){
Pattern xAxis = Pattern.compile("[-+]?([0-9]*//.)?[0-9]+");
Matcher mForX = xAxis.matcher(xaxis.getText().toString());
Pattern yAxis = Pattern.compile("[-+]?([0-9]*//.)?[0-9]+");
Matcher mForY = yAxis.matcher(yaxis.getText().toString());
Pattern zAxis = Pattern.compile("[-+]?([0-9]*//.)?[0-9]+");
Matcher mForZ = zAxis.matcher(zaxis.getText().toString());
//If Axis X and Axis Y and Axis Z are all valid entries, the proceed.
if(mForX.find() && mForY.find() && mForZ.find()){
//handle insert or update statement here
}else{
//give error message regarding correct Axis value format
}
}
}
Tienes que agregar numberSigned en la etiqueta EditText de tu diseño (* .xml)
<EditText android:inputType="numberDecimal|numberSigned"></EditText>
¡Buena suerte!
establecer InputType.TYPE_NUMBER_FLAG_SIGNED en EditText.setInputType