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

画面上の何かに触れると、レイアウトのルート ビューによってタッチ ジェスチャが取得されます。次に、タッチ ジェスチャが消費されるまで、その子に 1 つずつ渡します。子がクリック可能なビューの場合、タッチ ジェスチャを使用して true を返します。タッチ ジェスチャが他のビューに渡されないようにします。子がクリック可能なビューでない場合は、false を返すだけで、タッチ ジェスチャは次の子に渡されます。

最後に、タッチ ジェスチャを使用する子ビューがない場合は、親自体に送り返されます。タッチ ジェスチャがあれば、親はそれを使用できるようになりました。

あなたの場合、 ListView は親で、 Button は子です。まず、ListView はタッチ ジェスチャをボタンに渡します。ボタンはデフォルトでクリック可能なビューであるため、タッチ ジェスチャを消費するため、ListView の OnItemClickListener は機能しません。focusable、focusableInTouchMode、clickable を明示的に false に設定すると、ボタンはクリック不可のビューになります。そのため、ボタンはタッチ ジェスチャを消費せず、ListView の OnItemClickListener が機能します。

于 2016-05-02T15:40:17.203 に答える