W mojej aplikacji mam kilka takich przycisków:
<Button
android:id="@+id/bSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="Search"
android:textSize="24sp" />
Próbuję utworzyć ten sam przycisk z tekstem i ikoną. android: drawableLeft nie działa dla mnie (może tak, ale nie wiem, jak ustawić maksymalną wysokość ikony).
Utworzyłem więc LinearLayout z ImageView i TextView i sprawiłem, że zachowuje się jak przycisk:
<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>
Mój nowy przycisk jest dokładnie tym, czego chcę (rozmiar czcionki, ikona i rozmieszczenie tekstu). Ale nie wygląda jak moje domyślne przyciski:
Próbowałem więc zmienić tło i kolor tekstu mojego nowego przycisku:
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());
Daje to dziwny wynik, mój stary przycisk jest pomieszany:
Kiedy zmieniam kolejność tych dwóch przycisków w kodzie XML, więc „nowy przycisk” pojawia się jako pierwszy, pojawia się kolejny dziwny wynik:
Teraz zauważyłem, że kiedy próbuję wcisnąć stary przycisk, naciskany jest nowy.
Jakieś pomysły?
Aby dodać obraz z lewej, prawej, góry lub dołu, możesz użyć następujących atrybutów:
android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom
Przykładowy kod podano powyżej. Możesz to również osiągnąć za pomocą układu względnego.
źródło
android:drawableStart
zamiast Left iandroid:drawableEnd
zamiast Right.Dla każdego, kto chce robić to dynamicznie
setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)
pomocny będzie obiekt przycisków.Próba
Button search = (Button) findViewById(R.id.yoursearchbutton); search.setCompoundDrawables('your_drawable',null,null,null);
źródło
To jest to, czego naprawdę chcesz.
<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" />
źródło
Możesz użyć Biblioteki komponentów materiałów i
MaterialButton
komponentu.Użyj atrybutów
app:icon
iapp:iconGravity="start"
.Coś jak:
<com.google.android.material.button.MaterialButton style="@style/Widget.MaterialComponents.Button.Icon" app:icon="@drawable/..." app:iconGravity="start" ../>
źródło
Odpowiedź @Liem Vo jest prawidłowa, jeśli używasz android.widget.Button bez nadpisywania. Jeśli nadpisujesz motyw za pomocą MaterialComponents, nie rozwiąże to problemu.
Więc jeśli tak
Użyj parametru app: icon .
<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" />
źródło