android - 为什么在 Android Studio 中单击没有 android:onClick 的 TextView 时会触发 OnClick 事件?
问题描述
以下代码来自项目架构示例,您可以在此处查看。
有LinearLayout
事件android:onClick
,TextView
控件没有android:onClick
事件。
我认为OnClick
当我单击左侧空间而不是CheckBox
或TextView
控件被占用时,该事件将被触发。但实际上OnClick
当我点击时触发了一个事件TextView
,为什么?
顺便说一句,OnClick
当我单击时不会触发事件CheckBox
。
task_item.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>
解决方案
默认情况下,视图具有该android:clickable="false"
属性,除非为它们提供了 onClick 侦听器或该属性被显式声明为"true"
。
当您有重叠的视图并且一个被点击并且它有时android:clickable="false"
,它将忽略点击事件,因此它下面的任何不忽略点击事件的视图都将处理点击。在您的情况下,如果单击 TextView 它会忽略它,并且 LinearLayout 的 onClick 将触发。要防止这种行为,请将android:clickable="true"
和添加android:focusable="true"
到 TextView。这将使它接受点击但什么都不做,而不是将点击传递给它下面的视图。
推荐阅读
- sql - Bigquery 滚动月份数据
- git - 如何将更改从一个功能分支复制到从同一父分支派生的另一个功能分支
- node.js - 哪种 oauth 令牌类型更适合基于节点 js 的应用程序。JWT 还是不透明的?在哪里存储它们中的每一个
- sql - 从一个表中选择所有列,从另一个表中选择一些列
- firebase - Firebase PWA 可以离线存储多少(多媒体文件)?
- python - 如何将坐标存储到python中的数组中?
- java - 如何解决无法启动活动错误?
- c# - EF Core 3.1 在特定数据库上下文上添加迁移
- html - CSS 问题 - 不显示/显示块显示奇怪的行为
- ios - 如何在 Swift 中按一次按钮后播放歌曲列表