Android: onKeyDown не срабатывает до тех пор, пока после щелчка мыши - PullRequest
0 голосов
/ 02 августа 2011

У меня есть событие onKeyDown, которое должно отображать изображение после его запуска, но я заметил, что, несмотря на нажатие соответствующей клавиши несколько раз, изображение не появляется, пока я не щелкну мышью в любом месте холста. Любые предложения по актуальной проблеме и как действовать? Довольно новичок в концепции, поэтому не совсем уверен, что может отсутствовать. * Отредактированный и вставленный класс полностью. Спасибо

public class BuccaneerView extends TileView {

public static final int PLAYER = 1;
public static final int GREEN_STAR = 2;



Coordinate P_Location;

public BuccaneerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initBucc();
}

private void initBucc() {

    this.setFocusable(true);



    Resources r = this.getContext().getResources();

    resetTiles(4);
    loadTile(PLAYER, r.getDrawable(R.drawable.aerialplayer));
    loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));

    /**/

    P_Location = new Coordinate(5,5);
    setTile(PLAYER, P_Location.x, P_Location.y);

}


 @Override
    public boolean onKeyDown(int keyCode, KeyEvent msg) {

     if (keyCode == KeyEvent.KEYCODE_SPACE) 
     {

         setTile(GREEN_STAR, 1, 0);         
     }


     return super.onKeyDown(keyCode, msg);
 }

 public void update()
 {


 }

}

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Вы, похоже, рассматриваете onKeyDown как один из ваших методов on.

return super.onKeyDown(keyCode, msg);

Это плохая вещь, как будто вы вызвали эту функцию и хотите вернуть, какая клавиша была нажата. Измените его так, чтобы оно просто возвращало false, что будет означать, что вы обрабатываете то, что делает клавиатура.

EDIT

Есть ли причина, по которой вы используете onKeyDown, а не onKey? Вот некоторый дополнительный код, который я использую, он использует массив логических значений (selectedKeys длиной 128), и вы можете позже использовать его для проверки массива, чтобы увидеть, нажата ли клавиша

public boolean onKey(View v, int keyCode, KeyEvent event) 
{
     if (event.getAction() == android.view.KeyEvent.ACTION_DOWN) 
     {
         if(keyCode > 0 && keyCode < 127)
             pressedKeys[keyCode] = true;
     }

    if (event.getAction() == android.view.KeyEvent.ACTION_UP) 
    {
        if(keyCode > 0 && keyCode < 127)
            pressedKeys[keyCode] = false;
    }

    keyEventsBuffer.add(keyEvent);
}
   return false;
}

Итак, с этим вы можете сказать

If(pressedKeys[KeyYouWantToCheck])
{
//Do some stuff if that key is down
}
0 голосов
/ 03 августа 2011

Предполагается, что событие key не доставляется тому, на кого вы включили прослушиватель ключей. Это может произойти, если между ними есть другое представление, которое является слушателем и которое останавливает распространение ключевого события (т.е. возвращает true из этого метода). Есть некоторые представления, которые делают это по умолчанию (например, EditText для большинства ключей). Было бы полезно, если бы вы могли отредактировать свой вопрос и добавить больше кода или описать настройку своей деятельности.

«Нажав на холст», вы, вероятно, меняете фокус и заставляете ключевое событие передаваться в другое представление. Это может объяснить, почему вы внезапно видите, что ключевой слушатель работает после нажатия.

...