Подтвердить что ты не робот

Параметр макета Android InputType - как разрешить отрицательные десятичные знаки?

У меня есть макет, который имеет три поля для ввода трех координат карты. Все идет нормально. Я использую android: inputType = "numberDecimal" в макете. При вводе в поле пользователь получает цифровую клавиатуру. Все еще хорош.

Однако, когда необходимо ввести отрицательную координату, нет очевидного способа сделать это.

23.2342 отлично работает. 232.3421 работает нормально. -11.23423 не может быть введен - невозможно ввести главный отрицательный знак или даже обернуть координату в().

Я уверен, что смогу пойти по пути изменения этого текста в текстовый inputType, а затем использовать регулярное выражение для проверки того, что введенное на самом деле является числовой координатой, обрабатывать сообщения об ошибках пользователю и т.д. Но Я бы предпочел не идти по этому маршруту.

У меня есть Googled и Stackoverflow этот вопрос в течение нескольких часов без везения. Любые предложения?

4b9b3361

Ответ 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);