onKey()が2回呼び出されるのはなぜですか?


85

私はこのコードを使用しています:

public boolean onKey(View v, int keyCode, KeyEvent event) {
msg = (EditText)findViewById(R.id.msg);
String message = msg.getText().toString();
            if(keyCode == 66)
            {
                //It's hitting here twice.          
            }
            return false;
        };

Enterキーを押したときに2回ヒットする理由を教えてもらえますか?


18
一度ダウン、一度アップ?onKeyDown()またはonKeyUp()を試すか、KeyEvent.getAction()を確認してください。
benvd 2010

回答:


210

OnKeyは2回起動されます。1回目はキーダウン時、2回目はキーアップ時なので、以下をフィルタリングする必要があります。

YOUR_VIEW.setOnKeyListener(new OnKeyListener()
        {                           
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                //This is the filter
                if (event.getAction()!=KeyEvent.ACTION_DOWN)
                    return true;

                switch (keyCode) {
                case KeyEvent.KEYCODE_1 : 
                    MakeToast(1);
                    break;
                case KeyEvent.KEYCODE_2 : 
                    MakeToast(2);
                    break;
                case KeyEvent.KEYCODE_3 : 
                    MakeToast(3);
                    break;

                }

                return true;
            }

        });

2
trueまたはfalseを返すことは、スーパークラスにとって意味がありますか?
OrhanC1 2012

6
処理されていないキーに対してfalseを返す必要がありますか?
yostane 2012年

2
どうやらそれはreturn false処理されていないキーのためでなければなりません。このコードを挿入すると、EditTextフォーカスがあるとアプリが戻るボタンに応答しなくなります...
luiges90 2014年

これを行うと、keyevent dpad_centerのonClickとしてのリッスンが停止します
A_rmas 2016

ありがとうございますがevent.getAction()!=KeyEvent.ACTION_DOWNfalseこの場合は戻ってきます。の場合true、他のキーが消費されます。戻るボタンでアクティビティ/フラグメントを終了することもありません!
CoolMind

1
 itemView.setOnKeyListener(new View.OnKeyListener() {
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    int pos = getAdapterPosition();
    if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_MENU){
     //code here
    }
    return false;
  }
 });

0
edittext.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN || keyEvent.getAction() == KeyEvent.ACTION_UP) {
                switch (i) {
                    case KeyEvent.KEYCODE_ENTER:
                        if (!HelperFunction.isStringEmpty(edittext.getText().toString())) {

                            if (loadCount == 0) {

                                loadCount ++;


                            }
                        }
                    default:
                        return false;
                }
            }
            return false;
        }

このコードブロックは、コードを2回呼び出すことを防ぎます。loadCount String valueを使用します。loadCount== 0の場合、コードブロックを実行し、ifブロックでloadCount ++を実行しています。したがって、MyCodeブロックは時間どおりに機能します。


コードの機能と問題の解決方法について説明することを検討してください。
アンキット2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.