Я пытаюсь создать макет, где два вида (в данном случае ImageButtons) находятся точно друг над другом. Оба должны обрабатывать события касания для переключения альфа-кнопок.Touch events for Views друг на друга
Однако только кнопка сверху принимает событие касания (но ничего не делает, поскольку это альфа-значение 0). ButtonBelow не получает никаких событий Touch, когда я нажимаю на кнопки.
кода я использовал для создания представлений и OnTouchListeners:
// Create 2 Buttons on top of each other
final ImageButton buttonBelow = new ImageButton(getActivity());//ImageButton
buttonBelow.setImageResource(R.drawable.ic_action_locate);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
buttonBelow.setLayoutParams(layoutParams);
final ImageButton buttonAbove = new ImageButton(getActivity());//ImageButton
buttonAbove.setImageResource(R.drawable.ic_action_delete);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
buttonAbove.setLayoutParams(params);
buttonAbove.setAlpha(0.0f);
root.addView(buttonBelow);
root.addView(buttonAbove);
buttonBelow.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP && v.getAlpha() > 0) {
Log.e("Button", "Pressed below");
buttonBelow.setAlpha(0.0f);
buttonAbove.setAlpha(1.0f);
return true;
}
return false;
}
});
buttonAbove.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP && v.getAlpha() > 0) {
Log.e("Button", "Pressed above");
buttonBelow.setAlpha(1.0f);
buttonAbove.setAlpha(0.0f);
return true;
}
return false;
}
});
Как можно buttonBelow получить сенсорное событие?
Хорошо, это сработает, я думаю. Но нельзя просто передать событие касания ко второй кнопке, потому что верхняя часть блокирует его? Я думал, что это то, что возвращал false в onTouch для ... – Mauin
yes, если вы вернете true, это означает, что событие было уничтожено, а false означает, что оно должно быть передано следующему слушателю. это будет моей первой рекомендацией, но я увидел, что вы на самом деле делаете это правильно. Вероятно, система даже не считает, что кнопка ниже подходит для вызова, вы можете проверить ее, если вы загружаете источники Android и отлаживаете ее шаг за шагом. Но в любом случае сделать класс реализацией слушателя и использовать ту же самую функцию для обработки всех кнопок на экране - это хороший, широко используемый и даже предпочтительный подход. Таким образом, вы можете положиться на него и чувствовать себя хорошо! –
Да, просто попробовал, и он работает в этом примере. Однако в моем «реальном» проекте у меня нет ссылок на мои ImageButtons, я создаю их и создаю их TouchListeners в другом месте и не знаю, какие виды находятся друг на друге .. Я посмотрю, смогу ли я сделать такой подход работайте с этой проблемой. Благодаря! – Mauin