为什么将 Button 添加到 (Android) ListView 项目会关闭项目本身的点击侦听器事件?
Why does adding a Button to (Android) ListView item shut down tap listener events for the item itself?
我有一些非常简单的 xml 定义 ListView 项。每个项目包含 2 个 TextView 小部件和一个 Button。我昨天才添加了按钮,突然点击 ListView 项目本身不再产生 onItemClick() 事件。
我已经仔细地复制了这个,只需删除 XML 中 ListItem 的 Button 条目就可以触发 onItemClick() 事件。其他 SO 问题的答案表明,放置在 ListView 项上的控件可能会捕获或以其他方式阻止点击事件触发侦听器(例如,请参见 here)。因此,希望找到解决方法,我将以下 3 行添加到我的 TextView 控件中但没有效果:
android:focusable="false"
android:textIsSelectable="false"
android:clickable="false"
我的 xml 正确显示所有内容并且是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linLyt"
>
<TextView
android:id="@+id/tvVal1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_gravity="left|center_vertical"
android:text="0."
android:textSize="16sp"
android:maxLines="1"
android:layout_weight=".15"
/>
<TextView
android:id="@+id/tvVal2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:gravity="left"
android:layout_gravity="center_vertical"
android:text=""
android:textSize="16sp"
android:maxLines="1"
android:layout_weight=".55"
android:focusable="false"
android:textIsSelectable="false"
android:clickable="false"
/>
<Button
android:id="@+id/btnClickMe"
android:layout_width="0dp"
android:layout_height="40dp"
android:gravity="right|center_vertical"
android:layout_gravity="right"
android:textColor="@color/CornflowerBlue"
android:text="Click"
android:minHeight="0dp"
android:minWidth="0dp"
android:textSize="16dp"
android:maxLines="1"
android:layout_weight=".3"
android:background="?android:attr/selectableItemBackground"
/>
</LinearLayout>
同样,只需简单地删除或注释掉 Button xml,然后侦听器突然又开始触发。
添加这个:
android:descendantFocusability="blocksDescendants"
在 listview
的根布局中使列表视图项目点击侦听器工作。 blocksDescendants
表示 ViewGroup
将阻止其后代获得焦点。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
android:id="@+id/linLyt"
>
在代码中:
yourListview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> list, View v, int pos, long id) {
// Your code for item click
}
});
现在,对于列表视图行中的按钮单击侦听器:您可以在自定义适配器的 getView()
方法中设置 onClick()
事件。
我有一些非常简单的 xml 定义 ListView 项。每个项目包含 2 个 TextView 小部件和一个 Button。我昨天才添加了按钮,突然点击 ListView 项目本身不再产生 onItemClick() 事件。
我已经仔细地复制了这个,只需删除 XML 中 ListItem 的 Button 条目就可以触发 onItemClick() 事件。其他 SO 问题的答案表明,放置在 ListView 项上的控件可能会捕获或以其他方式阻止点击事件触发侦听器(例如,请参见 here)。因此,希望找到解决方法,我将以下 3 行添加到我的 TextView 控件中但没有效果:
android:focusable="false"
android:textIsSelectable="false"
android:clickable="false"
我的 xml 正确显示所有内容并且是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linLyt"
>
<TextView
android:id="@+id/tvVal1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_gravity="left|center_vertical"
android:text="0."
android:textSize="16sp"
android:maxLines="1"
android:layout_weight=".15"
/>
<TextView
android:id="@+id/tvVal2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:gravity="left"
android:layout_gravity="center_vertical"
android:text=""
android:textSize="16sp"
android:maxLines="1"
android:layout_weight=".55"
android:focusable="false"
android:textIsSelectable="false"
android:clickable="false"
/>
<Button
android:id="@+id/btnClickMe"
android:layout_width="0dp"
android:layout_height="40dp"
android:gravity="right|center_vertical"
android:layout_gravity="right"
android:textColor="@color/CornflowerBlue"
android:text="Click"
android:minHeight="0dp"
android:minWidth="0dp"
android:textSize="16dp"
android:maxLines="1"
android:layout_weight=".3"
android:background="?android:attr/selectableItemBackground"
/>
</LinearLayout>
同样,只需简单地删除或注释掉 Button xml,然后侦听器突然又开始触发。
添加这个:
android:descendantFocusability="blocksDescendants"
在 listview
的根布局中使列表视图项目点击侦听器工作。 blocksDescendants
表示 ViewGroup
将阻止其后代获得焦点。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
android:id="@+id/linLyt"
>
在代码中:
yourListview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> list, View v, int pos, long id) {
// Your code for item click
}
});
现在,对于列表视图行中的按钮单击侦听器:您可以在自定义适配器的 getView()
方法中设置 onClick()
事件。