Listview中的可聚焦按钮

时间:2016-05-02 15:15:04

标签: android listview focusable

对于具有自定义行布局的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()执行?

2 个答案:

答案 0 :(得分:1)

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

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

现在,在您的情况下,ListView是父级,Button是子级。首先,ListView将触摸手势传递给按钮。由于按钮是默认的可点击视图,因此它会消耗触摸手势,因此ListView的OnItemClickListener将无法工作。通过显式设置可聚焦的focusableInTouchMode,可点击为false,该按钮变为不可点击的视图。因此按钮不会消耗触摸手势,而ListView的OnItemClickListener也可以使用。

答案 1 :(得分:0)

尝试添加此行:

android:clickable="false"