У меня есть LinearLayout над кнопкой.Есть ли способ обработать событие нажатия кнопки? - PullRequest
0 голосов
/ 20 сентября 2019

у меня есть один xml активности андроида и его xml внутри, делающий основной RelativeLayout. Что RelativeLayout внутри добавляет одну кнопку и одну linearlayout, и я нажимаю на кнопку, но не нажимаю, из-за этой кнопки слишком линейный макет

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/parentLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </LinearLayout>

</RelativeLayout>

getActivity().findViewById(R.id.btnTest).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "onClick: ");
            }
        });

нажмите, чтобы распечатать журнал.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Относительный макет такой же, как линейный макет, который сохраняет порядок элементов, добавленных в него.Вы добавили кнопку «Сначала», а затем «Линейный макет», поэтому кнопка опустилась ниже линейного макета, поэтому вы не можете нажать на нее.Повторите линейный макет над видом кнопки, и вы увидите кнопку и выполните оставшуюся часть с помощью Java-кодирования

0 голосов
/ 20 сентября 2019

Попробуйте это:

<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 - это событие для пользователя, поднимающего палец.

...