Попробуйте это:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
<Button
android:id="@+id/btnTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Виды Android xml создаются как стек, в котором представления ниже в файле XML отображаются поверх тех, что были ранее в файле.
Звучит такваш линейный макет перехватывает события касания, не позволяя им распространяться на кнопку под ним.
Способ проверить это - установить фон на линейном макете, вы увидите, что когда он имеет цветной фонкнопка не видна.
Обновление:
Поскольку существует требование разрешить события касания как для кнопки, так и для макета, я расширю свое решение.
OnClickListeners - это стандартный метод получения событий касания в представлениях Android.Однако внизу есть OnTouchListeners , которые обрабатывают необработанные прикосновения к представлению, а не события щелчка.
При касании экрана андроида любым способом, когда событие записывается, и андроид отправляет прикосновениесобытие до первого взгляда, что событие касания столкнется.OnTouchListeners возвращают логическое значение, указывающее, использовали ли они событие.Если они не использовали событие, то оно передается следующему представлению вниз в иерархии, с которым может столкнуться событие касания.
Именно поэтому нажатие вашей кнопки изначально никогда не регистрировалось, поскольку макет потреблялсобытие касания и предотвращение его распространения на кнопку.
Это стандартное поведение Android, только одно представление будет обрабатывать любое событие касания.
Решение сделать иначе - признак того, чтоВы должны рассмотреть дизайн своего приложения и решить, действительно ли это необходимо.
Однако, в случае, если ваши обстоятельства являются одним из редких случаев, которые я приведу, и примером для сенсорного слушателя.
Обратите внимание, что этот прослушиватель на ощупь предполагает, что вы используете xml, который я разместил выше, а также слушатель щелчка, прикрепленный к кнопке в исходном вопросе.однако сработает как при прикосновении пользователя к макету, так и снова, когда он отпуститтак как это два отдельных события движения.
Для запуска только по одному типу события движения вам нужно изучить пропущенное событие.
getActivity()
.findViewById(R.id.parentLayout)
.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.e(TAG, "onTouch: ");
}
return false;
}
});
В этом коде журнал будет происходить только когдапользователь поднимает палец от вида, поскольку ACTION_UP - это событие для пользователя, поднимающего палец.