对于具有自定义行布局的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()
执行?
答案 0 :(得分:1)
当您触摸屏幕上的某些内容时,触摸手势将通过布局的根视图获得。然后它将触摸手势逐个传递给其孩子,直到它被消耗。如果孩子是可点击的视图,则它会使用触摸手势并返回true。这样触摸手势就不会传递给其他视图。如果孩子不是可点击的视图,那么它只返回false,触摸手势将传递给下一个孩子。
最后,如果没有子视图使用触摸手势,它将被发送回父母本身。现在父母可以使用触摸手势,如果有的话。
现在,在您的情况下,ListView是父级,Button是子级。首先,ListView将触摸手势传递给按钮。由于按钮是默认的可点击视图,因此它会消耗触摸手势,因此ListView的OnItemClickListener将无法工作。通过显式设置可聚焦的focusableInTouchMode,可点击为false,该按钮变为不可点击的视图。因此按钮不会消耗触摸手势,而ListView的OnItemClickListener也可以使用。
答案 1 :(得分:0)
尝试添加此行:
android:clickable="false"