EditText - 仅允许从上下文中获知的特定字符

时间:2013-09-11 08:18:30

标签: android android-edittext keylistener

在我的应用中,我有EditText。我希望用户只能插入由我指定的数字和两个字符。我知道存在android:digits="..."但我无法使用它,因为我从上下文中获取了这两个字符。现在我写了KeyListener:

public class CurrencyKeyListener implements KeyListener {

  @Override
  public void clearMetaKeyState(View view, Editable content, int states) {
    // TODO Auto-generated method stub

  }

  @Override
  public int getInputType() {
    return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
  }

  @Override
  public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
    return false;
  }

  @Override
  public boolean onKeyOther(View view, Editable text, KeyEvent event) {
    // TODO Auto-generated method stub
    return false;
  }

  @Override
  public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
    CharFormatter charFormatter = new CharFormatter(view.getContext());
    char pressedKey = (char) event.getUnicodeChar();
    if (Character.isDigit(pressedKey) || pressedKey == currencyFormatter.getDecimalSeparator()
        || pressedKey == currencyFormatter.getGroupingSeparator()) {
      return false;
    }
    return true;
  }

}

但当然它不起作用,我不知道如何解决这个问题。这个监听器阻止许多重要的字符,如清除按钮,并允许输入我不想允许的许多字符。然后在一些随机的瞬间,它会阻挡我的整个键盘。

有谁知道如何正确编写此KeyListener?提前谢谢。

2 个答案:

答案 0 :(得分:2)

这是执行此类任务的正确方法

InputFilter filter = new InputFilter() { 
        public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 
                for (int i = start; i < end; i++) { 
                        // Your condition here 
                        if (!Character.isLetterOrDigit(source.charAt(i))) { 
                                return ""; 
                        } 
                } 
                return null; 
        } 
}; 

edit.setFilters(new InputFilter[]{filter}); 

答案 1 :(得分:1)

在这里看到我的答案如何创建自定义InputFilter InputFilter on EditText cause repeating text,当然你必须修改位过滤条件