Попытка поймать щелчок на элементе ListView android: android: descendantFocusability = "blocksDescendants" не работает

Это было рассмотрено во многих сообщениях в StackOverflow. Наиболее рекомендуемым решением является установка:

android:descendantFocusability="blocksDescendants"

в корневом макете макета списка. Я сделал следующее.

  • Установить android:descendantFocusability="blocksDescendants" в корне список элементов списка.
  • Вызывается setDescendantFocusability(BLOCK) в спискеView, а также каждый listViewItem.
  • Установите focus=disabled в ImageButtons

Однако при нажатии на одно из дочерних кнопок ImageButtons я не могу получить никаких слушателей на элементах ListView или ListView.

Ниже представлен шаблон, который я использую для рендеринга элемента списка.

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/reminderItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:descendantFocusability="blocksDescendants"
        android:padding="0dp">

    <RelativeLayout
            android:id="@+id/topPartOfReminder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp">

        <LinearLayout
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/textLayout">

            <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                <TextView
                        android:fontFamily="sans-serif-light"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="22sp"
                        android:text="10:00"
                        android:textStyle="normal"
                        android:id="@+id/textTime"/>
                <TextView
                        android:fontFamily="sans-serif-condensed"
                        android:textSize="9sp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="AM"
                        android:paddingLeft="2dp"
                        android:textStyle="normal"
                        android:id="@+id/textAmPm"/>
                <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:text=" - "
                        android:id="@+id/textDivider"/>
                <TextView
                        android:fontFamily="sans-serif-light"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="16sp"
                        android:text="March 26"
                        android:id="@+id/textDate"/>
            </LinearLayout>
            <TextView
                    android:fontFamily="sans-serif-light"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="12sp"
                    android:text="Blah blah blah blah"
                    android:id="@+id/textDescription"/>
        </LinearLayout>

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_toRightOf="@+id/textLayout"
                android:gravity="right">

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/shiftButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_forward"
                    android:layout_marginLeft="10dp"/>

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/repeatButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_refresh"
                    android:layout_marginLeft="10dp"/>

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/tickButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_done"
                    android:layout_marginLeft="10dp"/>

        </LinearLayout>
    </RelativeLayout>


    <LinearLayout
            android:id="@+id/tickButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="OK"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="Cancel"/>

    </LinearLayout>

    <LinearLayout
            android:id="@+id/repeatButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="day"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="weekday"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="week"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="month"/>

    </LinearLayout>

    <LinearLayout
            android:id="@+id/shiftButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="1 week"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="1 day"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="1 hour"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="10 mins"/>

    </LinearLayout>
</LinearLayout>

Я также устанавливаю эту способность потомства в код, просто чтобы убедиться:

public class ReminderItemAdapter extends CursorAdapter {
    . . .

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View v = mLayoutInflater.inflate(R.layout.reminder_item, parent, false);
        parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        return v;
    }

И по стилю моего ImageButton я установил focusable = false, просто для хорошей меры:

<resources>
    <style name="HorizontalButton">
        <item name="android:layout_width">0dip</item>
        <item name="android:layout_weight">1</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textSize">12sp</item>
        <item name="android:background">?android:attr/selectableItemBackground</item>
        <item name="android:focusable">false</item>
        <item name="android:focusableInTouchMode">false</item>
    </style>
    . . .

Я получаю onClick полученный при нажатии на любую часть элемента списка, включая дочерние элементы TextView. Однако при нажатии на любую из кнопок ImageButtons щелчок не подбирается. (BTW У меня есть OnClickListeners, зарегистрированные в ImageButtons, и они вызываются.)

Установили:

  • setOnItemClickListener в ListView
  • setOnItemSelectedListener в ListView
  • setOnClickListener для каждого элемента списка.

Но ни один из них не вызван, если нажата одна из кнопок ImageButtons.

Любая помощь будет оценена.

Ответ 1

Попробуйте использовать это внутри каждой макеты кнопок

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

и удалите другую вещь, которую вы делаете для этого. Также из списка. Также удалите это

android:descendantFocusability="blocksDescendants"

и это тоже

parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);

Ответ 2

Просто поместите android:focusable="false" в строку /item.xml спискаView.

Он решает всю вашу проблему. если вы поместите event listener on the listView.. Это не позволит вам нажимать на весь ListView Row. Я имею в виду

listView.setOnClickListener(this); не будет вызываться. потому что фокус перемещается в row/item of the listView. Добавляя android:focusable="false" к Button или ImageView, на которые вы помещаете событие. Он потеряет фокус, а фокус - с помощью listView. Теперь вы можете иметь listView clickable as well as its descendents rows/item..

Короче говоря, поместите android:focusable="false в TextView/Button or ImageView, у которых есть Listeners в Item/row.xml.

Ответ 3

Вы пробовали добавить android: clickable = "false" для кнопок? Я просто столкнулся с подобной проблемой и исправил ее для меня, тогда как использование android: focusable = "false" не было.

Удачи!