Android: KeyListener EditText не работает - PullRequest
3 голосов
/ 31 января 2012

Я пытаюсь отфильтровать входной символ EditText, чтобы разрешить только допустимое значение с плавающей точкой.(например: "12,45", только одна запятая, ...).

Для этого я использую KeyListener (не путайте с onKeyListener или textChangeListener. Я хочу запретить вводу пользователем недопустимых данных).

В Android 2.3.6 и 3.2 keyListener.filter () и keyListener.getAcceptedChars () не вызываются, и я могу ввести любой символ (не ограничиваясь .getAcceptedChars ())

Iнашел немного документации о keyListener.Если у вас есть хороший пример или документ, мне очень интересно.

Любая подсказка, почему это не работает?

Что я сделал не так?

Пример кода активности:

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(...);

        setContentView(R.layout.editTextTest_lyt);

...

 mEditTextTest = (EditText) findViewById(R.id.editTextTest);

mEditTextTest.setKeyListener(new NumberCommaDecimalKeyListenerTest());

...}

Пример кода макета:

editTextTest_lyt.xml:
            <EditText
                android:id="@+id/editTextTest"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"
                android:layout_weight="1"
                android:inputType="numberSigned|numberDecimal"
                android:ems="5"
                android:maxLength="9"
                android:maxLines="1"
                android:gravity="right|center_vertical"
                android:imeOptions="actionNext"/>

Пример кода KeyListener:

public class NumberCommaDecimalKeyListenerTest extends NumberKeyListener {

private static final char[] mAccepted = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', ',' };
    private static final boolean    mSign = true;
    private static final boolean    mDecimal = true;

    @Override

    protected char[] getAcceptedChars()
    {
      Log.e("LODA", "KeylistenerTest.getAcceptedChars()"); // DONT show up in logs 
        return mAccepted;
    }

    public NumberCommaDecimalKeyListenerTest()
    { super();
  Log.e("LODA", "CREATE KeylistenerTest"); // show up in logs 
    }

    @Override
    public int getInputType()
    {
    Log.e("LODA", "KeylistenerTest.getInputType()"); // show up in logs 
        int contentType = InputType.TYPE_CLASS_NUMBER;
        if (mSign)
        {
            contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
        }
        if (mDecimal)
        {
            contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
        }
        return contentType;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
    {
    Log.e("LODA", "enter KeylistenerTest.filter"); // DONT show up in logs 

        // My logic will go here...

        // if user pressed '.', is changed for ','
        source = source.toString().replace(".", ",");
        source = source.toString().replace("6", "9");

        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        return out;
    }

}

1 Ответ

6 голосов
/ 01 февраля 2012

Глядя на документы Android, они утверждают в отношении KeyListener, что:

Обратите внимание, что в большинстве случаев этот интерфейс был заменен общими мягкими методами ввода, как определено InputMethod;его следует использовать только в тех случаях, когда приложение имеет собственную экранную клавиатуру, а также хочет обрабатывать события жесткой клавиатуры, чтобы соответствовать ей

И для метода getInputType():

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

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

Так как вывернуть тип содержимого, KeyListener игнорируется.Похоже, это невозможно, или вы нашли обходной путь?

Возможно, вы могли бы вместо этого создать пользовательский TextWatcher и затем установить его в EditText, используя EditText.addTextChangedListener(TextWatcher textWatcher) .?

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