Tratando de coger un clic en android ListView item: android: descendantFocusability = "blocksDescendants" no funciona
Esto ha sido abordado en muchos puestos en StackOverflow. La solución más recomendada es establecer:
android:descendantFocusability="blocksDescendants"
En el diseño raíz del diseño del elemento de lista. He hecho lo siguiente.
- ¿Cómo cambiar la altura de ListView de forma dinámica en Android?
- Android Listview imagen de fondo muestra en cada fila, ¿por qué?
- Android ListView: detecta si los datos de ListView se ajustan a la pantalla sin desplazarse
- SetOnItemClickListener en ListView que amplía la actividad
- Encabezado estático en ListView, CustomBaseAdapter
- Establecer
android:descendantFocusability="blocksDescendants"
en el diseño de elementos de lista raíz. - Se llama
setDescendantFocusability(BLOCK)
en el listView, así como cada listViewItem. - Establecer el
focus=disabled
en ImageButtons
Sin embargo, cuando se hace clic en uno de los ImageButtons hijo, no puedo obtener ningún oyente en los elementos ListView
o ListView
para disparar.
A continuación se muestra la "plantilla" que estoy usando para procesar un elemento de lista.
<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>
También estoy estableciendo este descendantFocusability en el código, sólo para estar seguro:
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; }
Y en el estilo de mi ImageButton que he fijado focusable = false, sólo por buena medida:
<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> . . .
Estoy recibiendo onClick recibido al hacer clic en cualquier parte del elemento de la lista, incluidos los elementos TextView para niños. Sin embargo, al hacer clic en cualquiera de los ImageButtons, el clic no se recoge. (BTW tengo OnClickListeners registrado con los ImageButtons y se están llamando.)
Haber instalado:
- SetOnItemClickListener en ListView
- SetOnItemSelectedListener en ListView
- SetOnClickListener en cada elemento ListView.
Pero ninguno de estos se llama si se hace clic en uno de los ImageButtons.
Cualquier ayuda sería apreciada.
- Android listview: adapter.add (item)? O adapter.notifyDataSetChanged ()
- ¿Puedo cambiar el estilo de ListView Android sin crear listview personalizado?
- Diseño relativo verificable como elemento en la lista de selección múltiple
- Obtención de datos almacenados de la base de datos en ListView.
- ListView onItemLongClickListener no impide que los grifos de enlace
- Android ListView - pequeña línea entre los elementos
- Android: Actualizar ListView Items cada 1 minuto
- Cambiar el color del texto de ListView simple Opción múltiple Android
Trate de usar esto dentro de cada diseño de los botones
android:focusable="false" android:focusableInTouchMode="false"
Y quitar otra cosa que usted está haciendo para esto. También de listview. También eliminar esto
android:descendantFocusability="blocksDescendants"
y esto también
parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Sólo tienes que poner
android:focusable="false"
en la fila / item.xml de la listView.
Resuelve todo tu problema. Si pones un event listener on the listView
.. No te permitirá hacer clic en toda ListView Row. quiero decir
listView.setOnClickListener(this);
No será llamado. Porque el foco se mueve a la row/item of the listView
. Agregando android:focusable="false"
al Button o ImageView en el que se pone un Evento. Se perderá su enfoque y el enfoque es ganar por listView. Ahora puede tener listView clickable as well as its descendents rows/item..
En pocas palabras poner android:focusable="false
en TextView/Button or ImageView
que tienen el evento Listeners en el artículo / row.xml.
¿Has probado a agregar android: clickable = "false" para los botones? Me encontré con un problema similar y que lo arregló para mí, mientras que el uso de android: focusable = "false" no.
¡Buena suerte!