2012-01-31 5 views
3

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

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

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

Я нашел немного о документации 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; 
    } 

} 

ответ

6

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

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

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

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

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

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

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

+0

похоже, что я пропустил понятный класс ClassListener. (Кстати, что значит «вообще не используется»?!?). спасибо за это понимание. – Loda

+0

Я думаю, это означает, что в большинстве случаев он не будет использоваться, за исключением того, что возвращаемый тип getInputType() - TYPE_NULL. – user1173706

+0

Может быть. в любом случае документ этого класса не очень ясен/завершен. Я скоро сделаю тест. – Loda

Смежные вопросы