Tenho alguns botões como este em meu aplicativo:
<Button
android:id="@+id/bSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="Search"
android:textSize="24sp" />
Estou tentando criar um mesmo botão com texto e um ícone. android: drawableLeft não funciona para mim (talvez funcionasse, mas não sei como definir uma altura máxima para o ícone).
Então, criei um LinearLayout com um ImageView e um TextView e o fiz funcionar como um botão:
<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>
Meu novo botão é exatamente o que eu quero (tamanho da fonte, ícone e posicionamento do texto). Mas não se parece com meus botões padrão:
Então tentei mudar o fundo e a cor do texto do meu novo botão:
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());
Isso dá um resultado estranho, meu botão antigo fica bagunçado:
Quando eu mudo a ordem desses dois botões no XML, para que o "novo botão" vá primeiro, ele produz outro resultado estranho:
Agora eu percebi que, quando tento pressionar o botão antigo, o novo é pressionado.
Alguma ideia?
Para adicionar uma imagem à esquerda, direita, superior ou inferior, você pode usar atributos como este:
android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom
O código de amostra é fornecido acima. Você também pode conseguir isso usando o layout relativo.
fonte
android:drawableStart
vez de Esquerda e emandroid:drawableEnd
vez de Direita.Para quem deseja fazer isso dinamicamente,
setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)
o objeto de botões ajudará.Amostra
Button search = (Button) findViewById(R.id.yoursearchbutton); search.setCompoundDrawables('your_drawable',null,null,null);
fonte
Você pode usar a Biblioteca de Componentes de Materiais e o
MaterialButton
componente.Use os atributos
app:icon
eapp:iconGravity="start"
.Algo como:
<com.google.android.material.button.MaterialButton style="@style/Widget.MaterialComponents.Button.Icon" app:icon="@drawable/..." app:iconGravity="start" ../>
fonte
Isso é o que você realmente quer.
<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" />
fonte
A resposta de @Liem Vo está correta se você estiver usando android.widget.Button sem qualquer substituição. Se você estiver substituindo seu tema usando MaterialComponents, isso não resolverá o problema.
Então se você é
Use app: parâmetro de ícone .
<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" />
fonte