试图抓住对 android ListView 项目的点击:android:descendantFocusability=“blocksDescendants"不工作 [英] Trying to catch a click on android ListView item: android:descendantFocusability="blocksDescendants" not working

查看:30
本文介绍了试图抓住对 android ListView 项目的点击:android:descendantFocusability=“blocksDescendants"不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 StackOverflow 上的许多帖子中已经解决了这个问题.最推荐的解决方案是设置:

This has been addressed in many posts on StackOverflow. The most recommended solution is to set:

android:descendantFocusability="blocksDescendants"

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

on the root layout of the list item layout. I've done the following.

  • 在根上设置 android:descendantFocusability="blocksDescendants"列表项布局.
  • 在 listView 上调用 setDescendantFocusability(BLOCK),以及每个 listViewItem.
  • 在 ImageButton 上设置 focus=disabled
  • Set android:descendantFocusability="blocksDescendants" on the root list item layout.
  • Called setDescendantFocusability(BLOCK) on the listView, as well as each listViewItem.
  • Set focus=disabled on the ImageButtons

但是,当单击其中一个子 ImageButton 时,我无法在 ListViewListView 项目上触发任何侦听器.

However when one of the child ImageButtons is clicked, I can't get any listeners on the ListView or ListView Items to fire.

下面是我用来呈现列表项的模板".

Below is the "template" I am using to render a list item.

<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,只是为了确定:

Am also setting this descendantFocusability in the code, just to be sure:

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,只是为了更好的衡量:

And on the styling of my ImageButton's I've set focusable=false, just for good measure:

<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 并且它们被调用了.)

I am getting onClick's received when clicking on any part of the list item, including the child TextView elements. However when clicking on any of the ImageButtons, the click's don't get picked up. (BTW I have got OnClickListeners registered with the ImageButtons and they are getting called.)

已设置:

  • ListView 上的 setOnItemClickListener
  • ListView 上的 setOnItemSelectedListener
  • setOnClickListener 在每个 ListView 项上.

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

But none of these get called if one of the ImageButtons is clicked.

任何帮助将不胜感激.

推荐答案

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

Try using this inside each button layouts

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

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

and remove other thing which you are doing for this. Also from listview. Also remove this

android:descendantFocusability="blocksDescendants"

还有这个

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

这篇关于试图抓住对 android ListView 项目的点击:android:descendantFocusability=“blocksDescendants"不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆