2010-12-22 20 views
20

Bir EditText'e bir OnKeyListener ekledim. Bir KeyEvent'i yakalamak için onKey işleyicisini geçersiz kıldım.EditText isabet üzerinde anahtarı girin onKey iki kez

Bir kullanıcı enter tuşuna basarsa (ya bilgisayar emülatör kullanırken anahtarı veya donanım klavyesini kullanarak donanım giriş tuşunu kullanarak), onKey işleyicisi iki kez yürütülür. Her iki yürütme de keyCode 66'ya sahiptir.

Bu neden oluyor?

Ekranımın, kullanıcının giriş tuşuna bastığında, bir arama gerçekleştirilmesini istiyorum. Olanlardan dolayı, arama iki kez gereksiz yere oluyor.

Benim yöntemim şöyle görünür:

mFilter.setOnKeyListener(new View.OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) { 
       // perform search 
       return true; 
      } 
      return false; 
     } 
    }); 

cevap

23

Ahhhh

Bu aşağı yukarı tuşu ve anahtar için oluyor sence?

+0

. Sadece kod değil, 'KeyEvent' kontrol edin. HTC klavye ile tarihsel olarak bazı sorunları buldum, ancak bazen birden çok olayı tetikliyorlar (ve bazen kullanıcılar sadece spaz yapıp "birden çok kez" enter "tuşuna basarlar). eylem ateşlendi, böylece kaza sonucu ikinci ateşlemeyi önleyebilirsiniz. –

+0

İyi fikir. Arama görevi başladığında, birkaç saniyelik zamanlayıcı ile başka bir görevi başlatacağım ve bu iş parçacığı bitene kadar, kullanıcı tekrar giriş tuşuna basamayacaktır. – Andrew

+1

Bu cevap olarak işaretlenmemeli, lütfen aşağıdaki (daha kullanışlı) cevaplardan birini cevap olarak işaretleyiniz (Abdul'un tavsiye ederim). Teşekkürler. – Stunner

16
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) { 
+2

"anahtar aşağı" içindir ve kullanıcı basılı tuttuğu sürece oluşturulur. – jldupont

11

bu deneyin:

mFilter.setOnKeyListener(new View.OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if (event.getAction() == KeyEvent.ACTION_DOWN) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) { 
       // perform search 
       return true; 
      } 
     } 
     return false; 
    } 
}); 
6

böyle filtreleyebilirsiniz:

object.setOnKeyListener(new OnKeyListener() { 

     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { 
       // do stuff 
       return true; 
      } 

      return false; 
     } 
    }); 

idem Eğer KeyEvent.ACTION_DOWN

+0

Geçersiz kılmak benim için çalıştı. – a54studio

4

ile anahtar itmek zaman aynı sorunu vardı ve Yukarıdaki cevaplar bana yardımcı oldu ama Xamarin.Android (C#) kullanıyorum bu yüzden biraz farklı sözdizimi .. İşte ne olduğunu Orked benim için:

MyStringTextBox.KeyPressed += OnEnterKeyPressed; 

protected void OnEnterKeyPressed(object sender, View.KeyEventArgs e) 
{ 
    if (e.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up) 
    { 
     DoSomething(this, EventArgs.Empty); 
    } 
    else 
    { 
     e.Handled = false; 
    } 
} 

Bu şekilde, DoSomething() yalnızca Anahtarı (Yukarı) Enter isabet çağrıda olacağını sadece ve böylece bir kez ateş olurdu. Xamarin.Android

0

Üzerinde yapılan ve test edilen bu olay KeyEvent.ACTION_DOWN ve KeyEvent.ACTION_UP tarafından tetiklenir. Hata ayıklama işlemini tamamladım ve sonunda hiç kullanmadığım KeyEvent event adlı bir param olduğunu farkettim, sonra ben kontrol ettim ve sorunu buldum. Muhtemelen,