Tengo algunos botones como este en mi aplicación:
<Button
android:id="@+id/bSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="Search"
android:textSize="24sp" />
Estoy intentando crear un mismo botón con texto y un icono. android: drawableLeft no funciona para mí (tal vez lo haría, pero no sé cómo establecer una altura máxima para el icono).
Así que creé un LinearLayout con ImageView y TextView y lo hice actuar como un botón:
<LinearLayout
android:id="@+id/bSearch2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/btn_default"
android:clickable="true"
android:padding="16dp"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:adjustViewBounds="true"
android:maxHeight="30dp"
android:maxWidth="30dp"
android:scaleType="fitCenter"
android:src="@drawable/search_icon" />
<TextView
android:id="@+id/tvSearchCaption"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="24sp"
android:paddingRight="30dp"
android:gravity="center"
android:text="Search" />
</LinearLayout>
Mi nuevo botón es exactamente lo que quiero (tamaño de fuente, icono y ubicación del texto). Pero no se parece a mis botones predeterminados:
Así que intenté cambiar el fondo y el color del texto de mi nuevo botón:
Button Search = (Button) findViewById(R.id.bSearch);
LinearLayout bSearch2 = (LinearLayout) findViewById(R.id.bSearch2);
bSearch2.setBackground(bSearch.getBackground());
TextView tvSearchCaption = (TextView)findViewById(R.id.tvSearchCaption);
tvSearchCaption.setTextColor(bSearch.getTextColors().getDefaultColor());
Esto da un resultado extraño, mi viejo botón se estropea:
Cuando cambio el orden de estos dos botones en el XML, por lo que el "botón nuevo" va primero, produce otro resultado extraño:
Ahora me di cuenta de que cuando trato de presionar el botón antiguo, se presiona el nuevo.
¿Algunas ideas?
Para agregar una imagen a la izquierda, derecha, arriba o abajo, puede usar atributos como este:
android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom
El código de muestra se da arriba. También puede lograr esto usando un diseño relativo.
fuente
android:drawableStart
lugar de Izquierda y enandroid:drawableEnd
lugar de Derecha.Para cualquiera que busque hacer esto dinámicamente,
setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)
el objeto de botones será de ayuda.Muestra
Button search = (Button) findViewById(R.id.yoursearchbutton); search.setCompoundDrawables('your_drawable',null,null,null);
fuente
Esto es lo que realmente quieres.
<Button android:id="@+id/settings" android:layout_width="190dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:background="@color/colorAccent" android:drawableStart="@drawable/ic_settings_black_24dp" android:paddingStart="40dp" android:paddingEnd="40dp" android:text="settings" android:textColor="#FFF" />
fuente
Puede utilizar la biblioteca de componentes de materiales y el
MaterialButton
componente.Utilice los atributos
app:icon
yapp:iconGravity="start"
.Algo como:
<com.google.android.material.button.MaterialButton style="@style/Widget.MaterialComponents.Button.Icon" app:icon="@drawable/..." app:iconGravity="start" ../>
fuente
La respuesta de @Liem Vo es correcta si está utilizando android.widget.Button sin ninguna anulación. Si está anulando su tema usando MaterialComponents, esto no resolverá el problema.
Entonces si tu eres
Utilice la aplicación: parámetro de icono .
<Button android:id="@+id/bSearch" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="16dp" android:text="Search" android:textSize="24sp" app:icon="@android:drawable/ic_menu_search" />
fuente