2013-12-20 54 views
12

这在StackOverflow上很多帖子得到解决。最推荐的解决方案是设置:试图捉对Android的ListView项点击:机器人:descendantFocusability =“blocksDescendants”不工作

android:descendantFocusability="blocksDescendants" 

关于列表项布局的根布局。我做了以下。

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

然而,当点击了孩子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的的造型我已经设置可聚焦=假,只是为了好措施:

<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元素好评。但是,当点击任何ImageButton时,点击不会被拾取。 (顺便说一句我有与ImageButtons注册OnClickListeners和他们获取调用。)

设了:每个ListView项

  • setOnItemClickListener上的ListView
  • setOnItemSelectedListener上的ListView
  • setOnClickListener。

但是,如果点击ImageButton中的一个ImageButton,这些都不会被调用。

任何帮助,将不胜感激。

回答

12

尝试使用这种每个按钮布局

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

,并删除其他东西,你这样做是为了在这里面。 同样来自listview。 同时删除该

android:descendantFocusability="blocksDescendants" 

这也太

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

当你说“按钮布局”,你的意思是实际的ImageButton元素,或在持有这些按钮的布局?干杯。 – Ben

+0

每个图像按钮 – keshav

+0

完全如您所述。行为依然如此。调用实际ImageButton的侦听器。但是没有一个ListView或ListView项目的侦听器被调用。 – Ben

2

只要把android:focusable="false"在ListView的行/ item.xml。

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

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="falseTextView/Button or ImageView本身拥有的项目/ row.xml事件侦听器。

1

您是否尝试过为按钮添加android:clickable =“false”?我遇到了类似的问题,并为我解决了它,而使用android:focusable =“false”则没有。

祝你好运!