Почему событие OnClick запускается, когда я нажимаю TextView без android: onClick в Android Studio? - PullRequest
0 голосов
/ 05 мая 2020

Следующий код взят из образцов архитектуры проекта, вы можете увидеть его здесь .

LinearLayout имеет событие android:onClick, а элемент управления TextView имеет no android:onClick event.

Я думаю, что событие OnClick будет запущено, когда я щелкну левый sapce, а не CheckBox или TextView элементы управления заняты. Но на самом деле событие OnClick запускается, когда я нажимаю TextView, почему?

Кстати, событие OnClick не запускается, когда я нажимаю CheckBox.

элемент_задачи. xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <import type="android.widget.CompoundButton" />

        <variable
            name="task"
            type="com.example.android.architecture.blueprints.todoapp.data.Task" />

        <variable
            name="viewmodel"
            type="com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:orientation="horizontal"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingBottom="@dimen/list_item_padding"
        android:paddingTop="@dimen/list_item_padding"
        android:onClick="@{()-> viewmodel.openTask(task.id)}">

        <CheckBox
            android:id="@+id/complete_checkbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:onClick="@{(view) -> viewmodel.completeTask(task, ((CompoundButton)view).isChecked())}"
            android:checked="@{task.completed}" />

        <TextView
            android:id="@+id/title_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginStart="@dimen/activity_horizontal_margin"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:text="@{task.titleForList}"
            app:completedTask="@{task.completed}" />
    </LinearLayout>
</layout>

1 Ответ

1 голос
/ 05 мая 2020

По умолчанию представления имеют свойство android:clickable="false", если только им не назначен прослушиватель onClick или свойство явно не объявлено как "true".

Когда у вас есть перекрывающиеся представления, и один щелкается, и он имеет android:clickable="false", он будет игнорировать события щелчка, поэтому любое представление под ним, которое не игнорирует события щелчка, будет обрабатывать щелчок. В вашем случае, если щелкнуть TextView, он игнорирует его, и onClick LinearLayout срабатывает. Чтобы предотвратить такое поведение, добавьте android:clickable="true" и android:focusable="true" в TextView. Это заставит его принимать клики, но ничего не делать, вместо того, чтобы передавать клики в представление под ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...