2012-06-22 13 views
12

Tengo un elemento de la lista con un botón dentro.El elemento de la lista con el botón ya no se puede hacer clic

Cuando se muestra el botón, ya no se puede hacer clic en el elemento de la lista. Para que se pueda hacer clic de nuevo, he reemplazado el botón con una vista. El problema es que, cuando se hace clic en el elemento de la lista, el botón cambia la imagen de fondo (por ejemplo, si se hace clic en ella). ¿Cómo se puede evitar este mal comportamiento?

Gracias

+0

Aparentemente necesita 'android: focusable =" false "' para el botón. Esta pregunta es bastante común aquí – Raffaele

Respuesta

17

en realidad sólo he encontrado una maravillosa explicación: http://android.cyrilmottier.com/?p=525

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

+0

También es útil [publicaciones de Romain Guy] (https://groups.google.com/forum/?fromgroups#!topic/android-developers/H94wJpuX-Zg) – Raffaele

-1

Puede crear un archivo XML que contiene el comportamiento de la vista se ha hecho clic. Crear un archivo XML, custom_button.xml (o como se quiera llamarlo) y llenarlo 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 cambiar el

android:color="" 

Para

android:drawable="" 

Y asígnelos a cualquier recurso dibujable que tenga en su carpeta dibujable. A continuación, en el archivo XML para su presentación que contenga la vista, añadir:

android:background="custom_button" 
2

Puede probar esto:

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

La parte del enlace proporcionado por @Matroska que responde a la pregunta:
Debe añadir

android:descendantFocusability="blocksDescendants" 

a la ViewGroup matriz que define el diseño de un elemento de su ListView.

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

16

Establecer las siguientes propiedades para que el botón

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

Para ImageButton, también añadir lo siguiente a la vista padre

android:descendantFocusability="blocksDescendants" 
0

He aquí un ejemplo de un botón que se puede hacer clic dentro de un ListView. Si desea descargar el proyecto se puede descargar el proyecto de IntelliJ Gradle de mi sitio web: http://developersfound.com/ListButtonClickExample.zip

El adaptador personalizado en este ejemplo tiene el oyente clic en lugar del oyente dentro del fragmento o actividad. Está hecho de tal manera que solo está en el objeto detector y todos los botones están ligados a ellos por eficiencia.

Este es el diagrama 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í es 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 adaptador bastante extensamente y parece muy estable en ListView, ListActivities y ListFragments .

Cuestiones relacionadas