2016-11-09 2 views
0

Согласно android documentation, обнаружение ключа релиз должен быть простым, как:Android: как распознавать нажатия клавиш и выпустить события?

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    System.out.println("pressed"); 
    event.startTracking(); 
    return true; 
} 

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    System.out.println("released"); 
    return true; 
} 

но при попытке реализовать его, он не работает, как ожидалось.

Мне нужно определить, когда нажата клавиша клавиатуры Bluetooth, и принимать только один вызов onKeyDown, когда это происходит, и обнаруживать, когда тот же самый ключ освобожден. Я делаю что-то неправильно или есть другой способ получить этот желаемый результат?

При нажатии и удержании любой клавиши, я получаю это несколько раз на консоли:

I/System.out: pressed 
I/System.out: released 
I/System.out: pressed 
I/System.out: released 
I/System.out: pressed 
I/System.out: released 
I/System.out: pressed 
I/System.out: released 

Спасибо.

+0

«это не работает должным образом» - вы можете подробно объяснить, что вы ожидаете и какие результаты вы получаете. Например, что такое «много звонков, пока он нажат»? – CommonsWare

+0

, когда я нажимаю клавишу и удерживаю ее нажатой, я получаю многократно: I/System.out: нажата, I/System.out: выпущена. Я ожидаю, что он «нажал» один раз, когда я его нажму, и «отпустил», когда отпустил его, вместо этого «нажал» и «отпустил» повторно звонил, пока я нажимаю какой-либо заданный ключ ... – RodrigoFranco

+0

Попробуйте вернуться 'false' из обоих методов. – CommonsWare

ответ

0
Use OnTouchListener instead of OnClickListener: 

// this goes somewhere in your class: 
    long lastDown; 
    long lastDuration; 

    ... 

    // this goes wherever you setup your button listener: 
    button.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      lastDown = System.currentTimeMillis(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      lastDuration = System.currentTimeMillis() - lastDown; 
     } 
    }`enter code here` 
    }); 
+0

Но я не использую OnClickListener ... Я использую onKeyDown и onKeyUp. – RodrigoFranco