2014-12-01 1 views
0

Я следил за Google Touch Gestures Руководство по обнаружению событий клавиатуры D-pad, но они, похоже, не работают.KeyEvent.KEYCODE_DPAD_CENTER не был обнаружен

Вот часть моего кода:

public final class ResultActivity extends Activity implements AsyncResponse{ 

    [...] 

    @Override 
    public boolean onKeyUp(int keycode, KeyEvent event){ 
     if(keycode == KeyEvent.KEYCODE_DPAD_DOWN){ 
     //this doesnt get detected 
     return true; 
     } 
     if(keycode == 4){ 
     //this gets detected 
     return true; 
     } 
     return false; 
    }//end onKeyUp 

    }//end activity 

Да, я также пытался OnKeyDown.

Что может вызвать эту проблему?

+0

Возможно, у вас могут быть другие виды, которые захватывают прикосновение, прежде чем оно перейдет к вашему обратному вызову. – pt2121

+0

У меня только событие itemOnClick. Я попытался использовать GestureDetector, как они предположили, что тоже не работает. Вы, вероятно, правы. Мне нужно будет изучить это. – rottenoats

+0

Из документа, похоже, onGenericMotionEvent называется последним. http://developer.android.com/reference/android/app/Activity.html#onGenericMotionEvent(android.view.MotionEvent) – pt2121

ответ

2

Это не совсем ответ на ваш вопрос, но я думаю, что это хорошее предложение. У меня была такая же проблема, когда я пытался обнаружить . Я мог только получить два из этих событий, чтобы правильно зарегистрировать. После того, как я пару дней общался с ним, я решил искать другие варианты и наткнулся на GestureDetector, попробовал, и он отлично работал. Вы можете найти API docs here для GestureDetector. Я также дам вам несколько кодов, чтобы помочь.

Так я использовал GestureDetector в своем коде. На самом верху, я объявил частный GestureDetector:

private GestureDetector gestureDetector; 

Затем в методе onCreate(), я называю это метод, который создает GestureDetector (нет никаких причин, чтобы сделать это таким образом более просто создать его в onCreate() метод - это просто выглядит чище, так и более организованными):

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    gestureDetector = createGestureDetector(this); 
} 

метод createGestureDetector() выглядит следующим образом:

private GestureDetector createGestureDetector(Context context) { 
    GestureDetector gestureDetectorTemp = new GestureDetector(context, new GestureDetector.OnGestureListener() { 
         //we are creating our gesture detector here 
     @Override 
     public boolean onDown(MotionEvent motionEvent) { 
      return false; 
     } 

     @Override 
     public void onShowPress(MotionEvent motionEvent) { 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent motionEvent) { //onTap 
      AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
      am.playSoundEffect(SoundEffectConstants.CLICK); //if we tap once, play a click sound 
      return false; 
     } 
     @Override 
     public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float distanceX, float distanceY) { 
      return false; //this is the wrong kind of scroll 
     } 
     @Override 
     public void onLongPress(MotionEvent motionEvent) { 
     } 

     @Override 
     public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) { //fling = a single slide 
      int dx = (int) (motionEvent2.getX() - motionEvent.getX()); //figure out the distance moved horizontally 
      int dy = (int) (motionEvent2.getY() - motionEvent.getY()); //figure out the distance moved vertically 

      //if dx > 0, moved forward, if dx < 0, moved backward 
      //if dy > 0, moved up, if dy < 0, moved down 

      return true; 
     } 
    }); 

    return gestureDetectorTemp; 
} 

@Override 
public boolean onGenericMotionEvent(MotionEvent event) { 
    if (gestureDetector != null) { 
     return gestureDetector.onTouchEvent(event); 
    } 
    return false; 
} 

Вы должны быть уверены, что включите этот метод onGenericMotionEvent(), который у меня есть в конце. Именно это гарантирует, что ваш GestureDetector уведомляется каждый раз, когда происходит событие движения.

Последнее, что нужно отметить, это возврат в GestureDetector - вы возвращаете true, чтобы потреблять событие, или false, чтобы не потреблять его. Другими словами, если вы хотите переопределить то, что происходит по умолчанию, например, закрыть приложение, когда вы сдвигаетесь вниз, просто перейдите в событие onFling(), и если dy < 0, верните true. Это расходует событие и не отправляет его другим методам по умолчанию.

+0

Я попробую это в понедельник и дам вам знать, спасибо. – rottenoats

+0

@ Grimbode уверен. На мой взгляд, это лучший способ найти все сенсорные события. –

+0

в настоящее время работает над жестом, так как он может ответить на мой другой вопрос (связывая его в конце этого комментария). Мне было любопытно, почему вы выбрали GestureDetector из Android-андроида, а не из Google Glass. Есть ли причина, почему? Http: //stackoverflow.com/questions/27251831/recognizerintent-action-recognize-speech-blocked-when-a-tap-occurs – rottenoats

1

В вашем коде у вас есть KeyEvent.KEYCODE_DPAD_DOWN, но ваш вопрос говорит, что вы после KeyEvent.KEYCODE_DPAD_CENTER (что касается крана).

Я не думаю, что DPAD_DOWN отображается на стекле, так как прокручивание отображается на KEYCODE_BACK.

поэтому, если вы пытаетесь обнаружить использование крана KeyEvent.KEYCODE_DPAD_CENTER, или если вы после прокручивания используете KeyEvent.KEYCODE_BACK.