android — setOnClickListener;

#android #button #onclick #keyevent #keycode

#Android #кнопка #onclick #ключевое событие #код ключа

Вопрос:

Я возился с кодом примера Snake и пытаюсь модифицировать это ради обучения и, надеюсь, улучшения понимания того, как работает Android.

На данный момент я добавил две кнопки соответствующий код setOnClickListener, как показано ниже.

snake_layout.xml:

           <Button
         android:layout_height="39px"
         android:layout_width="55px" 
         android:layout_marginLeft="15px"
         android:text="Left"
         android:id="@ id/left_button" />

      <Button
         android:layout_height="39px" 
         android:layout_width="55px" 
         android:layout_marginLeft="240px"
         android:text="Right"
         android:id="@ id/right_button" />
  

и Snake.java:

 .
.
.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // No Title bar
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.snake_layout);

    final Button leftButton = (Button) findViewById(R.id.left_button);
    leftButton.setOnClickListener(new Button.OnClickListener() {  
        public void onClick(View v)
            {
                //perform action
            }
         });

    final Button rightButton = (Button) findViewById(R.id.right_button);
    rightButton.setOnClickListener(new Button.OnClickListener() {  
        public void onClick(View v)
            {
                //perform action
            }
         });
.
.
.
  

Обе кнопки отображаются там, где они должны быть, и работают, когда я пробую простой метод, такой как «finish()«.

Теперь, что я хотел бы сделать, это заставить эти кнопки запускать приведенный ниже код в SnakeView.java:

         if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        if (mDirection != EAST) {
            mNextDirection = WEST;
        }
        return (true);
    }

    if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
        if (mDirection != WEST) {
            mNextDirection = EAST;
        }
        return (true);
    }
  

Чтобы было понятно, мне нужно, чтобы мои пользовательские экранные кнопки выполняли ту же работу, что и «KEYCODE_DPAD_RIGHT» и «KEYCODE_DPAD_LEFT» в текущем коде.
Мой Xperia X10i не поставляется с DPAD, это его часть;-P

Я был бы очень признателен за некоторые указания в правильном направлении. Как вы могли догадаться, я довольно новичок в этом..

Заранее спасибо, ребята

Комментарии:

1. Я не вижу проблемы или вопроса. С чем вам нужна помощь?

Ответ №1:

Проверьте здесь:

Выбрасывание / имитация нажатий клавиш программно

Основная логика скрыта за:

 private void doInjectKeyEvent(KeyEvent kEvent) {
    try {
        /* Inject the KeyEvent to the Window-Manager. */
        windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(),
            kEvent.getRepeatCount(), kEvent.getDownTime(),
            kEvent.getEventTime(), true);
    } catch (DeadObjectException e) {
        e.printStackTrace();
    }
}
  

Ответ №2:

Вместо // perform action в ваших onClick методах скопируйте соответствующее тело из существующего кода (например, if (mDirection != EAST) mNextDirection = WEST; ).

Кроме того, указывать размеры кнопки в пикселях считается плохой практикой. Это плохо работает для кода, предназначенного для запуска на устройствах, которые могут иметь очень разную плотность пикселей и размеры экрана. Гораздо лучше позволить кнопкам самим определять размер в зависимости от того, что они содержат.

Ответ №3:

Вам нужно создать функцию в SnakeView.java это позволяет вам изменить mNextDirection.

 public void setMNextDirection(int direction){
  //check if the direction is recognised
  if (direction == EAST || direction == WEST ) { 
    mNextDirection = direction;
  }
  

После этого вы можете использовать:

 mSnakeView.setMNextDirection(mSnakeView.WEST);