【问题标题】:Trying to catch a click on android ListView item: android:descendantFocusability="blocksDescendants" not working试图点击 android ListView 项目:android:descendantFocusability="blocksDescendants" 不起作用
【发布时间】:2014-01-08 22:57:11
【问题描述】:

这已在 StackOverflow 上的许多帖子中得到解决。最推荐的解决方案是设置:

android:descendantFocusability="blocksDescendants"

在列表项布局的根布局上。我已经完成了以下操作。

  • 在根上设置android:descendantFocusability="blocksDescendants" 列表项布局。
  • 在listView上调用setDescendantFocusability(BLOCK),以及 每个 listViewItem。
  • 在 ImageButtons 上设置 focus=disabled

但是,当单击其中一个子 ImageButtons 时,我无法让 ListViewListView 项目上的任何侦听器触发。

下面是我用来渲染列表项的“模板”。

<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>

我也在代码中设置了这个descendantFocusability,只是为了确定:

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>
    . . .

单击列表项的任何部分(包括子 TextView 元素)时都会收到 onClick。但是,当单击任何 ImageButtons 时,单击不会被拾取。 (顺便说一句,我已经在 ImageButtons 中注册了 OnClickListeners,它们正在被调用。)

已设置:

  • ListView 上的 setOnItemClickListener
  • ListView 上的 setOnItemSelectedListener
  • 在每个 ListView 项上设置 OnClickListener。

但是如果单击 ImageButtons 之一,这些都不会被调用。

任何帮助将不胜感激。

【问题讨论】:

    标签: android listview


    【解决方案1】:

    尝试在每个按钮布局中使用它

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

    并删除您为此所做的其他事情。 也来自列表视图。 也删除这个

    android:descendantFocusability="blocksDescendants"
    

    还有这个

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

    【讨论】:

    • 当您说“按钮布局”时,您是指实际的 ImageButton 元素,还是在持有这些按钮的布局上?干杯。
    • 完全按照您的描述进行。行为保持不变。调用实际 ImageButton 的侦听器。但是没有调用 ListView 或 ListView 项的侦听器。
    • 删除这些也 parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    • 可以确认任何对 setDescendantFocusability 的调用都已删除,但行为仍然相同。干杯。
    【解决方案2】:

    您是否尝试为按钮添加 android:clickable="false"?我刚刚遇到了一个类似的问题,并且为我解决了这个问题,而使用 android:focusable="false" 没有。

    祝你好运!

    【讨论】:

      【解决方案3】:

      只需将android:focusable="false" 放在 listView 的 row/item.xml 中即可。

      它解决了你所有的问题。如果你放一个event listener on the listView .. 它不会让你点击整个 ListView 行。我是说

      listView.setOnClickListener(this); 不会被调用。因为焦点移动到 row/item of the listView 。通过将 android:focusable="false" 添加到放置 Event 的 Button 或 ImageView 中。 它会失去焦点,焦点被listView获得。现在你可以拥有listView clickable as well as its descendents rows/item..

      简而言之,只需将 android:focusable="false 放入 TextView/Button or ImageView 中,在 Item/row.xml 中有事件侦听器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多