Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Elemento de lista con el botón que ya no se puede hacer clic

Tengo un elemento de lista con un botón dentro.

Cuando se muestra el botón, ya no se puede hacer clic en el elemento de lista. Para hacerla clickable otra vez, he substituido el botón con una visión. El problema es que, cuando se hace clic en el elemento de lista, el botón cambia la imagen de fondo (como si se hace clic). ¿Cómo evitar este mal comportamiento?

Gracias

  • Pasar un parámetro al oyente onclick en un botón de una fila listview
  • ListView y los botones dentro de ListView
  • Android: elementos ListView con varios botones que se pueden hacer clic
  • 6 Solutions collect form web for “Elemento de lista con el botón que ya no se puede hacer clic”

    En realidad acabo de encontrar una explicación maravillosa: http://android.cyrilmottier.com/?p=525

    El problema y la solución están muy bien explicados allí.

    Establezca las siguientes propiedades para el botón

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

    Para ImageButton, también agregue lo siguiente a la vista principal

      android:descendantFocusability="blocksDescendants" 

    La parte del enlace proporcionada por @Matroska que responde a la pregunta:
    Debe agregar

     android:descendantFocusability="blocksDescendants" 

    Para el ViewGroup padre que define el diseño de un elemento de ListView.

    Nota: esto ya no te permitirá enfocar el botón interno con botones de hardware. (Lo siento, no puedo comentar aún)

    Puede probar esto:

      yourButton.setFocusable(false); yourButton.setFocusableInTouchMode(false); 

    Este es un ejemplo de un botón que se puede hacer clic en un ListView. Si desea descargar el proyecto, puede descargar el proyecto IntelliJ Gradle desde mi sitio web: http://developersfound.com/ListButtonClickExample.zip

    El adaptador personalizado en este ejemplo tiene el oyente de clics en lugar del oyente que está dentro del fragmento o actividad. Se hace es una manera que sólo hay en el objeto de escucha y todos los botones están vinculados a ellos para la eficiencia.

    Aquí está el diseño de ListItem:

     <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.jc_systems.listbuttonclickexample.app.ItemFragment"> <LinearLayout android:id="@+id/test_container" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image_list_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/exaple_icon" android:layout_weight=".1" android:layout_gravity="left|top"/> <TextView android:id="@+id/lbl_list_item" android:layout_width="168dp" android:layout_height="wrap_content" android:text="I think this should take up two lines..." android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical"/> <Button android:id="@+id/cmd_list_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello" android:layout_weight="0.2" android:paddingLeft="0dp" android:paddingRight="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:layout_gravity="right|top"/> </LinearLayout> </FrameLayout> 

    Y aquí está el CustomAdapter:

     import android.app.Activity; import android.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; public class MyCustomAdapter extends ArrayAdapter { private final ArrayList<FragmentItems> list; private static Activity context; private View.OnClickListener adaptrDynaListener = null; public MyCustomAdapter(Activity context, ArrayList<FragmentItems> list) { super(context, R.layout.fragment_items, list); this.context = context; this.list = list; adaptrDynaListener = new View.OnClickListener() { @Override public void onClick(View v) { String buttonText = ((Button) v).getText().toString(); new AlertDialog.Builder(MyCustomAdapter.context).setTitle("Alert").setMessage(buttonText).setNeutralButton("OK", null).show(); } }; } static class ViewHolder { protected ImageView image_list_image; protected TextView lbl_list_item; protected Button cmd_list_button; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; ViewHolder viewHolder = new ViewHolder(); if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.fragment_items, null); viewHolder.image_list_image = (ImageView) view.findViewById(R.id.image_list_image); viewHolder.lbl_list_item = (TextView) view.findViewById(R.id.lbl_list_item); viewHolder.cmd_list_button = (Button) view.findViewById(R.id.cmd_list_button); viewHolder.cmd_list_button.setTag(viewHolder); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } ViewHolder holder = (ViewHolder) view.getTag(); holder.lbl_list_item.setText(list.get(position).getMessage()); holder.cmd_list_button.setText(list.get(position).getButtonText()); holder.cmd_list_button.setOnClickListener(adaptrDynaListener); return view; }//public View getView(int position, View convertView, ViewGroup parent) public int getCount() { if(list.size() <= 0) { return 1; } return list.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } } 

    He probado este patrón del adaptador bastante extensamente y parece muy estable en ListView, ListActivities y ListFragments.

    Puede crear un archivo xml que contenga el comportamiento de clic de la vista. Cree un archivo xml, custom_button.xml (o lo que quiera llamar) y llénelo con este código:

     <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Focused --> <item android:state_focused="true" android:state_pressed="false" android:color="@color/black"/> <!-- Pressed --> <item android:state_focused="false" android:state_pressed="true" android:color="@color/black"/> <!-- Focused+Pressed --> <item android:state_focused="true" android:state_pressed="true" android:color="@color/black"/> <!-- Disabled --> <item android:state_enabled="false" android:color="@color/dark_grey_text"/> <!-- Default --> <item android:color="@color/white"/> </selector> 

    A continuación, puede

     android:color="" 

    A

     android:drawable="" 

    Y asignarlos a cualquier recurso extraíble que tenga en su carpeta dibujable. A continuación, en el archivo xml para su diseño que contiene la vista, agregue:

     android:background="custom_button" 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.