Android 的 EditText 问题:KeyListener

Posted

技术标签:

【中文标题】Android 的 EditText 问题:KeyListener【英文标题】:Problem with Android's EditText : KeyListener 【发布时间】:2011-09-24 18:27:07 【问题描述】:

EditText 组件上,我尝试设置KeyListener 以捕获ENTER 键(用于表单验证)。

    text.setKeyListener(new KeyListener() 

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

        @Override
        public boolean onKeyOther(View view, Editable text, KeyEvent event) 
            return false;
        

        @Override
        public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) 
            if (keyCode == KeyEvent.KEYCODE_ENTER) 
                onKeyEnterPressedListener.onKeyEnterPressed(AKText.this);
                return true;
             else 
                return false;
            
        

        @Override
        public int getInputType() 
            return 1;
        

        @Override
        public void clearMetaKeyState(View view, Editable content, int states) 

        
    );

问题是,每当我使用键盘输入EditText 时,所有的键都会被忽略,它也忽略了我的击键。但是,模拟器设备上的软板正在工作。

请问如何解决?

【问题讨论】:

【参考方案1】:

我会改用TextWatcher 类:

private TextWatcher tw = new TextWatcher() 
    public void afterTextChanged(Editable s)

    
    public void  beforeTextChanged(CharSequence s, int start, int count, int after)
      // you can check for enter key here
    
    public void  onTextChanged (CharSequence s, int start, int before,int count) 
     
;

EditText et = (EditText) findViewById(R.id.YOUR_EDITTEXT_ID);
et.addTextChangedListener(tw);

【讨论】:

很好的答案... onKey 侦听器并不总是有效...这有效!谢谢! TextWatcher 是在EditText 再次重新加载时调用 addTextChangedListener ** 浪费了几分钟找到它,呵呵.. caps C【参考方案2】:

您的意思是使用 setOnKeyListener() 吗?

http://developer.android.com/reference/android/view/View.html#setOnKeyListener(android.view.View.OnKeyListener)

http://developer.android.com/reference/android/view/View.OnKeyListener.html

editText.setOnKeyListener(new OnKeyListener() 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
        Log.i("KEY", Integer.toString(keyCode));
        return false;
    
);

【讨论】:

【参考方案3】:

这是因为您从 onKeyUp 方法返回 false,在 android 中具体操作是在 onKeyUp 方法之后处理的。

除了使用 KeyListener 之外,大多数活动都有一个可以覆盖的 onKeyUp 方法。

这是我一直在处理的一些代码示例。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) 
    if(keyCode == KeyEvent.KEYCODE_TAB) editText1.tab();
    if(event.isCtrlPressed())
    
        if(keyCode == KeyEvent.KEYCODE_O) // ctrl+o
        
            onClick(open);
        
        else if(keyCode == KeyEvent.KEYCODE_N) // ctrl+n
        
            addFileTab(null);                   // add untitled tab
            editText1.setText("");
        
        else if(keyCode == KeyEvent.KEYCODE_A) // ctrl+a
        
            editText1.selectAll();
        
        else if(keyCode == KeyEvent.KEYCODE_S) // ctrl+s
        
            onClick(save);
        
        else if(keyCode == KeyEvent.KEYCODE_C) // ctrl+c
        
            String selected = editText1.selection();
            ClipData clip;
            if(current != null) 
                clip = ClipData.newPlainText(current.getName() + " selection", selected);
            else
                clip = ClipData.newPlainText("Cerulean selection", selected);
            clipMan.setPrimaryClip(clip);
        
        else if(keyCode == KeyEvent.KEYCODE_P && clipMan.hasPrimaryClip()) // ctrl+p
        
            if(clipMan.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
            
                CharSequence clip = clipMan.getPrimaryClip().getItemAt(0).coerceToText(getBaseContext());
                editText1.insert(clip.toString());
            
        
        return false;
    
    if(keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_ENTER)
    
        onTabClicked(current, curTab);
    
    return super.onKeyUp(keyCode, event);

我将超类称为 onKeyUp 用于其他所有内容。希望它可以帮助某人。

-c

更新:仅处理硬件键盘,其他操作使用 TextWatcher。

【讨论】:

以上是关于Android 的 EditText 问题:KeyListener的主要内容,如果未能解决你的问题,请参考以下文章

Android 的 EditText 问题:KeyListener

EditText Android中的多语言问题

Android,从edittext中获取文本[重复]

Android将光标从一个EditText移动到另一个EditText?

如何在 Android 中禁用 EditText

Android - 问题解决之EditText自动获取焦点问题