Параметр макета Android InputType - как разрешить отрицательные десятичные дроби? - PullRequest
51 голосов
/ 21 февраля 2011

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

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

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

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

У меня есть вопрос в Google и Stack-overflowed в течение пары часов без удачи. Есть предложения?

Ответы [ 8 ]

130 голосов
/ 08 июля 2011

Если я что-то упустил, это все, что вам нужно

android:inputType="numberDecimal|numberSigned"
7 голосов
/ 19 февраля 2013

Пожалуйста, используйте этот код

 et.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);
4 голосов
/ 16 июля 2014

Вы должны добавить числоSigned в теге EditText вашего макета (* .xml)

 <EditText android:inputType="numberDecimal|numberSigned"></EditText>

Удачи!

3 голосов
/ 06 марта 2011

Я думаю, что создание собственного пользовательского кейлистера может быть вашим лучшим выбором. Я сделал что-то подобное. Я создал 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;
    }
}

А затем используйте этот пользовательский список ключей со своим текстом редактирования следующим образом:

EditText myEditText = (EditText)findViewById(R.id.myedittext);
myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());
2 голосов
/ 21 февраля 2011

установить InputType.TYPE_NUMBER_FLAG_SIGNED в EditText.setInputType

0 голосов
/ 28 июля 2017

Это работает для меня.

etbox.setInputType (InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);

0 голосов
/ 25 февраля 2011

Завершается с использованием Pattern и Matcher для каждой из осей, оставляя фактический формат ввода текста открытым.

Три поля осей, триггеры кнопки отправки при сохранении. Поля проверяются, и либо происходит вставка, либо отправляется сообщение об ошибке отправителю о требуемом формате для полей осей. Правильный формат - 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
        }
   }

}

0 голосов
/ 21 февраля 2011

Я не уверен насчет типа ввода, но вы всегда можете создать свой собственный текстовый фильтр и прикрепить его к полю editText.это довольно просто.Вы можете проверять каждый символ и разрешать только цифры, точки или любые другие символы, которые вам нравятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...