OnKey () neden iki kez çağrılır?


85

Bu kodu kullanıyorum:

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;
        };

Lütfen birisi bana enter tuşuna bastığımda neden iki kez vurulduğunu söyleyebilir mi?


18
Bir kez aşağı, bir kez yukarı? OnKeyDown () veya onKeyUp () deneyin veya KeyEvent.getAction () öğesini kontrol edin.
benvd

Yanıtlar:


210

OnKey iki kez tetiklenir: ilk kez tuşa basma ve ikinci kez tuş açma için, bu nedenle filtrelemeniz gerekir:

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
Doğru mu yanlış mı dönmenin süper sınıflar için bir anlamı var mı?
OrhanC1

6
İşlenmeyen anahtarlarda yanlış mı döndürmelisiniz?
yostane

2
Görünüşe göre return falseişlenmemiş anahtarlar için olmalı . Bu kodu yerleştirdim ve EditTextodaklandığında uygulamam geri düğmesine yanıt vermeyi
bıraktı

Bunu yapmak keyevent dpad_center'ı onClick olarak dinlemeyi durduracak
A_rmas

Teşekkürler event.getAction()!=KeyEvent.ACTION_DOWNama falsebu durumda döneceğim . Eğer true, başka herhangi bir anahtar kullanılacaktır. Geri düğmesiyle aktivitenizden / parçanızdan bile çıkmayacaksınız!
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;
        }

bu kod bloğu, kodun iki kez çağrılmasını engeller. Eğer loadCount == 0 kod bloğumu çalıştırırsa ve if bloğumda loadCount ++ yapıyorum, loadCount String değerini kullanıyorum. Böylece Kodum bloğu zamanında çalışır.


Kodunuzun ne yaptığı ve sorunu nasıl çözdüğü hakkında bir açıklama sağlamayı düşünün.
Ankit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.