Hacer que LinearLayout actúe como un botón

Tengo un LinearLayout que he diseñado para que parezca un botón, y contiene algunos elementos text / ImageView. Me gustaría hacer que todo LinearLayout actúe como un botón, en particular para darle estados que estén definidos de manera que tenga un fondo diferente cuando se presione.

¿Hay alguna manera mejor que hacer un ImageButton del tamaño de todo el diseño y posicionamiento absolutamente?

Me encontré con este problema ahora mismo. Tendrás que configurar LinearLayout para hacer clic. Puedes hacer esto en el XML con

 android:clickable="true" 

O en el código con

 yourLinearLayout.setClickable(true); 

¡Aclamaciones!

Si desea agregar el comportamiento de fondo predeterminado de Android para hacer que un Layout actúe como una vista “clicable”, establezca el Layout específico:

API 11+ (Android puro):

 android:background="?android:attr/selectableItemBackground" 

API 7+ (Android + AppCompat Support Library):

 android:background="?attr/selectableItemBackground" 

Cualquier API:

 android:background="@android:drawable/list_selector_background" 

Las respuestas anteriores siguen siendo ciertas, pero no me ayudaron por solo agregar el estado predeterminado de UI presionado y liberado (como en un ListView por ejemplo).

Primero, querrá un selector para definir los diferentes estados. Por ejemplo, en un archivo XML:

      

No lo he intentado, pero posiblemente puedes configurar el fondo de Android de LinearLayout en este selector y configurar Android: hacer clic en verdadero y funcionará.

Si no lo hace, puede cambiar a usar un RelativeLayout, y hacer que el primer elemento sea un botón con este selector como fondo y fill_parent para su ancho y alto de diseño. En este caso, simplemente use un Botón regular y configure Android: fondo para su selector. No tiene que poner texto en su botón.

Usé la primera y la segunda respuesta. Pero mi linearlayout tiene imágenes y texto con el color de fondo, así que tuve que cambiar “fondo” a “primer plano”

linearlayout

 android:foreground="?android:attr/selectableItemBackground" android:clickable="true" 

En la aplicación en la que estoy trabajando, necesito crear LinearLayout de forma dinámica. En este caso, el comando

 ll.setClickable(true); 

no está funcionando como se supone que debe hacer. Aunque puedo perder algo, logré explotar setOnTouchListener para obtener el mismo resultado y envié el código por si alguien tiene las mismas necesidades.

El siguiente código crea un LinearLayout con dos textviews y esquinas redondeadas, cambiando de color cuando se presiona.

En primer lugar, cree dos archivos xml en la carpeta dibujable, uno para el estado normal y otro para el estado del planchado lineal.

Estado normal xml (drawable / rounded_edges_normal.xml)

                 

Presionado xml de estado (drawable / rounded_edges_pressed.xml). La única diferencia está en el color …

                 

Entonces el siguiente código hace el trabajo

Variable global:

 public int layoutpressed = -1; 

En onCreate() :

 // Create some textviews to put into the linear layout... TextView tv1 = new TextView(this); TextView tv2 = new TextView(this); tv1.setText("First Line"); tv2.setText("Second Line"); // LinearLayout definition and some layout properties... final LinearLayout ll = new LinearLayout(context); ll.setOrientation(LinearLayout.VERTICAL); // it is supposed that the linear layout will be in a table. // if this is not the case for you change next line appropriately... ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); ll.setBackgroundResource(R.drawable.rounded_edges_normal); ll.addView(tv1); ll.addView(tv2); ll.setPadding(10, 10, 10, 10); // Now define the three button cases ll.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { if (arg1.getAction()==MotionEvent.ACTION_DOWN){ ll.setBackgroundResource(R.drawable.rounded_edges_pressed); ll.setPadding(10, 10, 10, 10); layoutpressed = arg0.getId(); } else if (arg1.getAction()== MotionEvent.ACTION_UP){ ll.setBackgroundResource(R.drawable.rounded_edges_normal); ll.setPadding(10, 10, 10, 10); if(layoutpressed == arg0.getId()){ // ........................................................................... // Code to execute when LinearLayout is pressed... // ........................................................................... } } else{ ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata); ll.setPadding(10, 10, 10, 10); layoutpressed = -1; } return true; } }); 

Solo establece estos atributos

  ...  

Simplemente agregue background attr / seleccionableItemBackground al diseño lineal y también haga que se pueda hacer clic en el diseño lineal.

ejemplo:

  

Eso hace que linearlayout actúe como un botón cuando presiona. 🙂

Esto fue útil, pero si desea poner un color de fondo y hacer que el diseño lineal se pueda hacer clic como el elemento de la lista. Establezca el fondo con su color preferido y establezca el color de primer plano en? Android: attr / seleccionableItemBackground, establezca el enfoque real y haga clic en true

Código de muestra

   

Las referencias anteriores trataban sobre cómo establecer el fondo predeterminado en el archivo xml. Aquí lo mismo en el código:

 linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);