В моем приложении есть такие кнопки:
<Button
android:id="@+id/bSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="Search"
android:textSize="24sp" />
Я пытаюсь создать такую же кнопку с текстом и значком. android: drawableLeft у меня не работает (может быть, но я не знаю, как установить максимальную высоту значка).
Итак, я создал LinearLayout с ImageView и TextView и заставил его действовать как кнопку:
<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>
Моя новая кнопка - это именно то, что я хочу (размер шрифта, значок и размещение текста). Но это не похоже на мои кнопки по умолчанию:
Итак, я попытался изменить фон и цвет текста моей новой кнопки:
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());
Это дает странный результат, моя старая кнопка перепуталась:
Когда я меняю порядок этих двух кнопок в XML, так что «новая кнопка» идет первой, получается еще один странный результат:
Теперь я заметил, что когда я пытаюсь нажать старую кнопку, нажимается новая.
Любые идеи?
Чтобы добавить изображение слева, справа, сверху или снизу, вы можете использовать такие атрибуты:
android:drawableLeft android:drawableRight android:drawableTop android:drawableBottom
Пример кода приведен выше. Вы также можете добиться этого, используя относительную компоновку.
источник
android:drawableStart
вместо Left иandroid:drawableEnd
вместо Right.Для тех, кто хочет делать это динамически, тогда
setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)
на кнопках объект поможет.Образец
Button search = (Button) findViewById(R.id.yoursearchbutton); search.setCompoundDrawables('your_drawable',null,null,null);
источник
Это то, чего вы действительно хотите.
<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" />
источник
Вы можете использовать Библиотеку компонентов материала и
MaterialButton
компонент.Используйте
app:icon
иapp:iconGravity="start"
атрибуты.Что-то типа:
<com.google.android.material.button.MaterialButton style="@style/Widget.MaterialComponents.Button.Icon" app:icon="@drawable/..." app:iconGravity="start" ../>
источник
Ответ @Liem Vo правильный, если вы используете android.widget.Button без какого-либо переопределения. Если вы переопределяете свою тему с помощью MaterialComponents, это не решит проблему.
Так что если ты
Используйте параметр 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" />
источник