Quiero tener un botón de Android con ícono + texto centrado en su interior. Estoy usando el atributo drawableLeft para configurar la imagen, esto funciona bien si el botón tiene un ancho de "wrap_content"
pero necesito estirarlo al ancho máximo, así que uso el ancho "fill_parent"
. Esto mueve mi icono directamente a la izquierda del botón y quiero que tanto el icono como el texto estén centrados dentro del botón.
Intenté configurar el relleno, pero esto solo permite dar un valor fijo, por lo que no es lo que necesito. Necesito tener icono + texto alineado en el centro.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
¿Alguna sugerencia sobre cómo podría lograrlo?
android
android-layout
user-interface
button
alignment
jloriente
fuente
fuente
Respuestas:
android: drawableLeft siempre mantiene android: paddingLeft como una distancia desde el borde izquierdo. Cuando el botón no está configurado para android: width = "wrap_content", ¡siempre se colgará a la izquierda!
Con Android 4.0 (nivel de API 14) puede usar el atributo android: drawableStart para colocar un elemento de dibujo al comienzo del texto. La única solución compatible con versiones anteriores que se me ocurrió es usar un ImageSpan para crear un Texto + Imagen Spannable:
En mi caso, también necesitaba ajustar el atributo android: gravity del Botón para que pareciera centrado:
fuente
button.setText(buttonLabel)
Sé que llegué tarde a responder esta pregunta, pero esto me ayudó:
Encontré esta solución desde aquí: la interfaz de usuario de Android tiene problemas: hacer un botón con texto e ícono centrados
fuente
Solía LinearLayout en lugar de botón . El OnClickListener , que necesito usar, funciona bien también para LinearLayout.
fuente
Todas las respuestas anteriores parecen estar desactualizadas
Puede usar el
MaterialButton
ahora que permite configurar la gravedad del icono.Para usar los componentes del material, obviamente necesitará:
Agregar una dependencia
implementation 'com.google.android.material:material:1.3.0-alpha01'
(usar la última versión)Haga que su tema amplíe el tema Componentes de material
En caso de que no pueda hacerlo, extiéndalo desde el tema Material Bridge
fuente
Lo ajusto agregando relleno a izquierda y derecha de la siguiente manera:
fuente
Recientemente me encontré con el mismo problema. Intenté encontrar una solución más barata, así que se me ocurrió esto.
A continuación, sólo llamar a la
OnClickListener
sobreLinearLayout
.Espero que esto ayude a alguien, ya que parece un problema muy común. :)
fuente
Puede utilizar un botón personalizado que se mida y se dibuje a sí mismo para acomodar un dibujable izquierdo. Encuentre el ejemplo y el uso aquí
Uso
fuente
Esta es mi solución que escribí hace 3 años. El botón tiene texto e ícono a la izquierda y está en el marco que es el botón real aquí y se puede estirar con fill_parent. No puedo probarlo de nuevo, pero estaba funcionando en ese entonces. Probablemente Button no tenga que usarse y pueda ser reemplazado por TextView, pero no lo probaré ahora y no cambia demasiado la funcionalidad aquí.
fuente
Sé que esta pregunta es un poco más antigua, pero tal vez todavía esté abierto a sugerencias o soluciones:
Cree un "wrap_content" de RelativeLayout con la imagen del botón como fondo o el propio botón como primer elemento del diseño. Obtenga un LinearLayout y configúrelo en "layout_centerInParent" y "wrap_content". Luego configura tu Drawable como Imageview. Por último, configure un TextView con su texto (configuración regional).
entonces básicamente tienes esta estructura:
o así:
Sé que con esta solución hay muchos elementos con los que lidiar, pero puedes crear muy fácilmente tu propio botón personalizado con él y también establecer la posición exacta del texto y los elementos de diseño :)
fuente
Mi forma de resolverlo implicó rodear el botón con
<View ../>
elementos livianos que cambian de tamaño dinámicamente. A continuación se muestran varios ejemplos de lo que se puede lograr con esto:Tenga en cuenta que el área en la que se puede hacer clic de los botones en el ejemplo 3 es la misma que en 2 (es decir, con espacios), que es diferente del ejemplo 4, donde no hay espacios en los que "no se pueda hacer clic" en el medio.
Código:
fuente
Intenta usar esta biblioteca
OmegaCenterIconButton
fuente
Puede crear un widget personalizado:
La clase de Java IButton:
}
El diseño ibutton.xml
Para utilizar este widget personalizado:
Debe proporcionar el espacio de nombres para los atributos personalizados xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx" donde com.test.android.xxx es el paquete raíz de la aplicación.
Simplemente colóquelo debajo de xmlns: android = "http://schemas.android.com/apk/res/android".
Lo último que necesitará son los atributos personalizados en attrs.xml.
En attrs.xml
Para un mejor posicionamiento, envuelva el botón personalizado dentro de un LinearLayout, si desea evitar problemas potenciales con los posicionamientos de RelativeLayout.
¡Disfrutar!
fuente
Tuve un problema similar, pero quería tener un diseño central sin texto y sin diseños ajustados. La solución fue crear un botón personalizado y agregar un elemento de dibujo más además de IZQUIERDA, DERECHA, SUPERIOR, INFERIOR. Uno puede modificar fácilmente la ubicación del dibujo y tenerlo en la posición deseada en relación con el texto.
CenterDrawableButton.java
attrs.xml
uso
fuente
Coloque FrameLayout en LinearLayout y establezca la orientación en Horizontal.
fuente
Podrías poner el botón sobre un LinearLayout
fuente
¿Qué sucede si prueba android: gravity = "center_horizontal"?
fuente
Creo que android: gravity = "center" debería funcionar
fuente
Como sugirió Rodja, antes de 4.0 no hay una forma directa de centrar el texto con el dibujable. Y, de hecho, establecer un valor padding_left aleja el elemento de diseño del borde. Por lo tanto, mi sugerencia es que en tiempo de ejecución calcule exactamente cuántos píxeles del borde izquierdo debe tener su dibujable y luego lo pase usando setPadding Su cálculo puede ser algo así como
El ancho de tus dibujables es fijo y puedes buscarlo y también puedes calcular o adivinar el ancho del texto.
Finalmente, necesitaría multiplicar el valor de relleno por la densidad de la pantalla, lo que puede hacer usando DisplayMetrics
fuente
No lo pruebo, pero parece que puede usar la biblioteca CenteredContentButton
fuente
La clase pública DrawableCenterTextView extiende TextView {
}
fuente
Arreglo sucio.
Calcular el acolchado correcto resuelve el propósito. Sin embargo, para una pantalla variada, use un relleno diferente y colóquelo en el recurso dimens en la carpeta de valor respectiva.
fuente
Use RelativeLayout (contenedor) y android: layout_centerHorizontal = "true" , mi muestra:
fuente
Otra posibilidad para mantener el tema del botón.
Con esta solución, si agrega @ color / your_color @ color / your_highlight_color en el tema de su actividad, puede tener el tema Matherial en Lollipop con sombra y ondulación, y para la versión anterior, el botón plano con su color y resaltar coor cuando lo presiona.
Además, con esta solución, el tamaño automático de la imagen
Resultado: Primero en el dispositivo Lollipop Segundo: En el dispositivo anterior a la piruleta 3 °: Presione el botón del dispositivo previo a la piruleta
fuente
Me he centrado
textView
con el icono usandopaddingLeft
y alineando textView a la izquierda | centerVertical . y para un pequeño espacio entre la vista y el ícono usédrawablePadding
fuente
android:paddingLeft
funcionó.Este puede ser un hilo antiguo / cerrado, pero he buscado en todas partes y no encontré nada útil, hasta que decidí crear mi propia solución. Si hay alguien aquí tratando de buscar una respuesta, pruebe esta, podría ahorrarle un minuto de pensamiento.
Debido a que el diseño lineal actúa como contenedor y el que tiene el selector, cuando hace clic en el diseño lineal completo, se verá exactamente como debería ser. si desea que ambos estén centrados, use relativo en lugar. Si lo desea centrado horizontalmente, cambie la orientación a horizontal.
Toma nota NO olvides agregar android: clickable = "true" a su contenedor principal (relativo o lineal) para que la acción tenga lugar.
Nuevamente, esto puede ser un hilo antiguo, pero aún puede ayudar a alguien allí.
-Saludos espero que ayude- happycodings.
fuente
Si utiliza una de las soluciones de vista personalizada , tenga cuidado, porque a menudo fallan en texto largo o de varias líneas . Reescribí algunas respuestas, las reemplacé
onDraw()
y entendí que era una forma incorrecta.fuente
He visto soluciones para alinear elementos dibujables al inicio / izquierda, pero nada para el extremo dibujable / derecha, así que se me ocurrió esta solución. Utiliza rellenos calculados dinámicamente para alinear el texto y los elementos de diseño tanto en el lado izquierdo como en el derecho.
Es importante configurar la gravedad en su diseño en "center_vertical | start" o "center_vertical | end" dependiendo de dónde coloque el icono. Por ejemplo:
El único problema con esta implementación es que el botón solo puede tener una sola línea de texto; de lo contrario, el área del texto llena el botón y los rellenos serán 0.
fuente
utilizar este
android:background="@drawable/ic_play_arrow_black_24dp"
simplemente establezca el fondo en el icono que desea centrar
fuente