Cómo crear un botón que contiene varias vistas?

En Android, me gustaría crear un botón que contenga otras vistas. Por ejemplo, algo como esto:

+---------------------------+ | Hello world! +-------+ | | | image | | | Some more info +-------+ | +---------------------------+ 

Pero me gustaría que fuera más flexible que este ejemplo específico. Idealmente, el botón sería simplemente capaz de contener un ViewGroup, por lo que podría implementar su diseño en un archivo XML separado. Sin embargo, como Button extiende View, pero no ViewGroup, esto no parece posible.

¿Hay alguna manera de lograr esto usando componentes estándar de Android, o tengo que recurrir a escribir una clase de botón personalizado?


Como se solicita, algunos XML de ejemplo que hace el truco:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:focusable="true" android:clickable="true" android:background="@android:drawable/btn_default"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/primary_text_light"/> <TextView android:id="@+id/additional_line_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/primary_text_light"/> <TextView android:id="@+id/additional_line_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/primary_text_light"/> </LinearLayout> 

Tuve que fijar el color en los TextViews explícitamente, de lo contrario serían casi ilegibles (son blancos por defecto). Desenterré el identificador del SDK: .../platforms/android-7/data/res/values/public.xml . Curiosamente, primary_text_light da texto en negro, mientras que primary_text_dark resulta en blanco …

Cree la disposición del botón deseado, y fije su android:background a @android:drawable/btn_default . Haga que la vista más externa que contiene el resto haga clickable y se pueda focusable y ya está.

No estoy seguro, pero ¿has probado la clase ImageButton ? Supongo que debería ser capaz de establecer la imagen a la derecha y debería ser capaz de añadir una etiqueta con nuevas líneas, también.

[Update] Me perdí la parte "más flexible". Si desea tener una más flexible, supongo que necesita crear una implementación propia con un OnTouchListener propio para manejar todos los posibles estados y detectar clics.

No crearía una clase para eso. Es sólo un RelativeLayout con dos TextView y un ImageView .

Como sabrás, un ViewGroup extiende la View y una View puede tener oyentes de clics. Por lo tanto, necesita crear el diseño y establecer un oyente de clics para él.

El problema aquí es cómo manejas los estados, puedes intentar usar @android:drawable/btn_default como fondo como @ cognian dijo.

  • Android: Cómo agregar un botón mediante programación para verlo
  • Android: obteniendo el ancho de un botón que se establece en wrap_content
  • Añadir botón en la vista personalizada en Android
  • Obtener la vista de los padres desde un diseño
  • ¿Hay alguna manera de girar un botón sin utilizar animación en android 2.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.