Попытка поймать щелчок на элементе 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" не было.
Удачи!