#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);