Параметр макета Android InputType - как разрешить отрицательные десятичные знаки?
У меня есть макет, который имеет три поля для ввода трех координат карты. Все идет нормально. Я использую android: inputType = "numberDecimal" в макете. При вводе в поле пользователь получает цифровую клавиатуру. Все еще хорош.
Однако, когда необходимо ввести отрицательную координату, нет очевидного способа сделать это.
23.2342 отлично работает.
232.3421 работает нормально.
-11.23423 не может быть введен - невозможно ввести главный отрицательный знак или даже обернуть координату в().
Я уверен, что смогу пойти по пути изменения этого текста в текстовый inputType, а затем использовать регулярное выражение для проверки того, что введенное на самом деле является числовой координатой, обрабатывать сообщения об ошибках пользователю и т.д. Но Я бы предпочел не идти по этому маршруту.
У меня есть Googled и Stackoverflow этот вопрос в течение нескольких часов без везения. Любые предложения?
Ответы
Ответ 1
Закончено использование Pattern и Matcher для каждой из осей, оставляя открытый формат ввода текста.
Поля с тремя осями, триггеры отправки кнопки на Save. Поля проверяются и происходит либо вставка, либо сообщение об ошибке для подателя сообщения о требуемом формате для полей Axes. Правильный формат - 1-3 цифры, необязательно предваряемый '-', необязательно сопровождаемый '.' и дополнительные цифры.
Попробуйте этот код:
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
}
}
}
Ответ 2
Если мне не хватает чего-то, это все, что вам нужно
android:inputType="numberDecimal|numberSigned"
Ответ 3
Пожалуйста, используйте этот код
et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);
Ответ 4
Вам нужно добавить numberSigned в тег EditText вашего макета (*.xml)
<EditText android:inputType="numberDecimal|numberSigned"></EditText>
Удачи!
Ответ 5
установите InputType.TYPE_NUMBER_FLAG_SIGNED в EditText.setInputType
Ответ 6
Я думаю, что создание собственного пользовательского keylistener может быть вашим лучшим выбором. Я сделал что-то подобное. Я создал SignedDecimalKeyListener следующим образом:
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;
}
}
И затем используйте этот настраиваемый keylistener с вашим edittext следующим образом:
EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());
Ответ 7
Я не уверен в типе ввода, но вы всегда можете создать свой собственный текстовый фильтр и прикрепить его в поле editText. это довольно просто. вы можете выполнить проверку на каждом символе и разрешить только цифры, точки или любой пользовательский символ, который вам нравится.
Ответ 8
Это работает для меня.
etbox.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);