StackOverflow上的许多帖子都解决了这个问题。最推荐的解决方案是设置:
android:descendantFocusability="blocksDescendants"
列表项布局的根布局。我做了以下事情。
android:descendantFocusability="blocksDescendants"
列表项目布局。setDescendantFocusability(BLOCK)
,以及
每个listViewItem。focus=disabled
但是,当单击其中一个子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>
我也在代码中设置了这个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,并且它们正在被调用。)
已设置:
但如果单击其中一个ImageButtons,则不会调用它们。
任何帮助都将不胜感激。
答案 0 :(得分:15)
尝试在每个按钮布局中使用此
android:focusable="false"
android:focusableInTouchMode="false"
并删除你正在为此做的其他事情。 也来自listview。 同时删除此
android:descendantFocusability="blocksDescendants"
这也是
parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
答案 1 :(得分:2)
只需将
android:focusable="false"
放在listView的row / 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="false
放在TextView/Button or ImageView
中,其中包含Item / row.xml中的事件监听器。
答案 2 :(得分:2)
您是否尝试为按钮添加android:clickable =“false”?我刚遇到一个类似的问题,并为我修复了它,而使用android:focusable =“false”却没有。
祝你好运!