0

对于具有如下自定义行布局的 ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">


    <Button
    android:layout_width="51dp"
    android:layout_height="43dp"
    android:id="@+id/btnBin"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:background="@drawable/ktape" />

    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
     android:textAppearance="?android:attr/textAppearanceLarge"
     android:text="Temporary"
    android:id="@+id/txtShowUsername"
    android:layout_gravity="center_horizontal"
    android:layout_weight="1"
    android:paddingTop="20dp"
    android:gravity="right"
       android:paddingRight="10dp" />
</LinearLayout>

该按钮不应该是可聚焦的,以让 ListView 的 OnItemClickListener 执行:

    android:focusable="false"
    android:focusableInTouchMode="false"

为什么我需要将focusable设置为false?为什么可聚焦按钮阻止OnItemClickListener.OnItemClick()执行?

4

2 回答 2

1

当您触摸屏幕上的某些东西时,触摸手势是通过布局的根视图获得的。然后它将触摸手势一一传递给它的孩子,直到它被消耗掉。如果孩子是可点击的视图,那么它会使用触摸手势并返回 true。这样触摸手势就不会传递给其他View。如果孩子不是可点击的View,那么它只是返回false,触摸手势将传递给下一个孩子。

最后,如果没有子视图消耗触摸手势,它将被发送回父视图本身。现在父母可以使用触摸手势,如果有的话。

现在,在您的情况下, ListView 是父级,而 Button 是子级。首先,ListView 将触摸手势传递给按钮。由于button默认是一个可点击的View,它会消耗触摸手势,所以ListView的OnItemClickListener不起作用。通过显式设置focusable、focusableInTouchMode、clickable为false,按钮变为不可点击View。所以按钮不会消耗触摸手势,并且 ListView 的 OnItemClickListener 工作。

于 2016-05-02T15:40:17.203 回答
0

尝试添加这一行:

android:clickable="false"
于 2016-05-02T15:20:56.530 回答