BackgroundTint Lollipop не влияет на кнопку
У меня есть кнопка в моей деятельности, и я хотел бы, чтобы у нее был цвет акцента моей темы. Вместо того, чтобы делать свои собственные рисунки, как мы должны были делать перед леденцом на палочке, естественно, я бы хотел использовать новый backgroundTint
приписывать.
<Button
android:id="@+id/btnAddCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/accent"
android:text="@string/addressInfo_edit_addCode" />
К сожалению, это не имеет никакого эффекта, кнопка остается серой.
Я пробовал разные значения для backgroundTintMode
, который ничего не изменил.
Я также попытался сделать это программно в своей деятельности, которая ничего не изменила.
addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
getResources().getColorStateList(R.color.accent));
Почему мой оттенок игнорируется?
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, я действительно тестирую на устройстве Lollipop. Другие виджеты (например, EditText) корректно и автоматически окрашиваются.
16 ответов
Проверено на API 19 - API 27
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.AppCompatButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/retry"
android:textColor="@android:color/white"
app:backgroundTint="@android:color/holo_red_dark" />
производит вывод как -
Плохие новости
Как говорит BoD, нет смысла окрашивать фон кнопки в Lollipop 5.0 (уровень API 21).
Хорошие новости
Lollipop 5.1 (уровень API 22), похоже, исправил это, изменив btn_mtrl_default_shape.xml (среди других файлов): https://android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E!/
Хорошие новости
Новая библиотека поддержки (версия 22.1+) добавляет обратно-совместимую поддержку тонирования для многих компонентов, включая AppCompatButton!
К сожалению, android:backgroundTint
свойство по-прежнему не работает (может быть, я делаю что-то не так), поэтому вы должны установить ColorStateList
в коде, используя setSupportBackgroundTintList()
, Было бы очень приятно увидеть android:backgroundTint
поддерживается в будущем. Обновление: Марсио Гранцотто прокомментировал, что app:backgroundTint
работает на AppCompatButton! Обратите внимание, что это app:
не android:
потому что это в приложении / библиотеке.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<AppCompatButton
android:id="@+id/mybutton"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Testing, testing"
app:backgroundTint="#ff00ff"/>
</LinearLayout>
Ваша активность автоматически раздувает AppCompatButton
вместо нормального Button
если вы позволите ему наследовать от AppCompatActivity
,
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
v.setSupportBackgroundTintList(csl);
}
}
Вы должны, конечно, получить ColorStateList
из цветного ресурса, но мне было лень, так что...
О, и не забудьте основать тему своего приложения на одном из Theme.AppCompat
темы или взгляды компатов будут очень и очень грустными...;)
Это работало как на 2.3.7 (Gingerbread MR1), так и на 5.0 (Lollipop 'Classic').
Кажется, что рисование рисованной ряби не имеет смысла (а фон кнопки по умолчанию - рисованная рябь).
На самом деле, посмотрев на отображаемую кнопку платформы по умолчанию, я нашел "правильный" способ сделать это: Вы должны определить это в своей теме:
<item name="android:colorButtonNormal">@color/accent</item>
(Конечно, это только для уровня 21+.)
Предупреждение: поскольку это определено в теме, будет использоваться данный цвет для всех кнопок (по крайней мере, для всех кнопок в действиях, использующих эту тему).
В качестве бонуса вы также можете изменить цвет пульсации, определив это:
<item name="android:colorControlHighlight">@color/accent_ripple</item>
Для решения проблем, связанных с тонировкой на Android 5.0.x, я использую что-то вроде этого:
public static void setButtonTint(Button button, ColorStateList tint) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) {
((AppCompatButton) button).setSupportBackgroundTintList(tint);
} else {
ViewCompat.setBackgroundTintList(button, tint);
}
}
Он использует метод поддержки только для API 21 и ViewCompat один для всех остальных случаев.
Просто используйте app:backgroundTint
вместо android:backgroundTint
, оттенок вступит в силу ниже Lollipop. Причина в AppCompatActivity
использование AppCompatViewInflater
для автоматического изменения Button или TextView на AppCompatButton или AppCompatTextView, затем app:backgroundTint
вступить в силу.
Я думаю, что вам нужно иметь android:background
готов сделать android:backgroundTint
Работа.
Чтобы быть более точным, я думаю, что вы не можете backgroundTint
фон кнопки по умолчанию из темы материалов, который определяется как RippleDrawable
,
Просто используйте приложение:backgroundTint вместо Android:backgroundTint
О подобной проблеме сообщили в Google https://code.google.com/p/android/issues/detail?id=201873
Но после выпуска библиотеки поддержки Android, редакция 23.2.1 (март 2016 г.) Эта ошибка устранена.
Проблема: FloatingActionButton.setBackgroundTintList(оттенок @Nullable ColorStateList) больше не меняет цвет фона
обновить библиотеку поддержки до Android Support Library to 23.2.1
Используйте библиотеку поддержки дизайна (23.2.1) и appcompatwidgets, как показано ниже
Дизайн материала для устройств перед леденцом на палочке:
AppCompat (также известный как ActionBarCompat) начинался как бэкпорт API-интерфейса ActionBar для Android 4.0 для устройств, работающих на Gingerbread, предоставляя общий уровень API поверх реализации с обратным портированием и реализации платформы. AppCompat v21 предоставляет API и набор функций, актуальный для Android 5.0
Библиотека поддержки Android 22.1:
Возможность подкрашивать виджеты автоматически при использовании AppCompat невероятно полезна для поддержания сильного брендинга и согласованности во всем приложении. Это делается автоматически при накачивании макетов - замена Button на AppCompatButton, TextView на AppCompatTextView и т. Д., Чтобы каждый из них мог поддерживать тонирование. В этом выпуске эти виджеты с поддержкой оттенков теперь общедоступны, что позволяет поддерживать поддержку оттенков даже в том случае, если вам нужно создать подкласс одного из поддерживаемых виджетов.
Если мы посмотрим на исходный код библиотеки поддержки, то увидим, что он обычно окрашивает известные кнопки, но если мы изменим форму нашей кнопки (у меня есть круглая кнопка), оттенок не будет работать нормально в api<=21. Мы также можем видеть, что TintManager стал общедоступным классом (appcompat-v7:23.1.1), поэтому мы можем взять ColorStateList из формы кнопки по умолчанию (которая хорошо окрашена в 5.0) для текущей темы (поэтому нам не нужно создавать массив цветов):
Context c = ...; // activity
AppCompatButton ab = ...; // your button
// works ok in 22+:
if (Build.VERSION.SDK_INT <= 21) {
// default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape":
// ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape);
// Appcompat 23.2 change:
ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape);
ab.setSupportBackgroundTintList(tint);
}
Если вы разрабатываете приложение, которое ваша цель
sdk
выше, чем API 21 и ваш
minSdkVersion is 21(Lollipop)
вместо
android:backgroundTint="@color/accent"
можно просто сказать..
android:background="@color/accent"
Ты можешь использовать backgroundTint
<android.support.design.button.MaterialButton
с "com.android.support:design:28.0.0-rc01"
версия
Имейте в виду, что эта самая ошибка может быть вызвана самой последней версией библиотеки.
Эта команда
sendBtnView.setBackgroundTintList(colorState)
отлично работал в прошлом, но перестань работать на меня. после исследования выясняется, что причиной является библиотека, которая была добавлена в зависимости gradle:
compile 'com.android.support:recyclerview-v7:+'
Поэтому я попытался изменить его на 23.02.1, как это было рекомендовано здесь, в посте Амита Вагела. Я поменял на
compile 'com.android.support:recyclerview-v7:23.02.1'
Но ошибка gradle говорит о том, что lib в recyclerview не имеет этой версии (23.02.1) (gradle не может найти ее в Jcenter raw.github или repo).
Затем, потому что я знал, что команда setBackgroundTintList раньше хорошо работала с версией 22.02.0'во всех других библиотеках, которые у меня есть в зависимости gradle. поэтому я изменяю это на:
compile 'com.android.support:recyclerview-v7:22.02.0'
И теперь это снова работает.
Потому что атрибут backgroundTint
используется только в API уровня 21 и выше
Я не уверен, если это рекомендуется, но вы можете попробовать это:
Drawable newDrawable = mBtnAction.getBackground(); // obtain Bg drawable from the button as a new drawable
DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor()); //set it's tint
mBtnAction.setBackground(newDrawable); //apply back to button
В общем смысле это работает. Пытался ViewCompat
но это, кажется, не работает должным образом.
Если вы используете androidx, то добавление как с префиксом, так и без префикса версии решает проблему на android 5.1:
<style name="Button_Primary">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:backgroundTint">@color/button_primary_selector</item>
<item name="backgroundTint">@color/button_primary_selector</item><!--needed for android 5-->
</style>
селектор button_primary находится в
color
папка со следующим содержимым:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto">
<item android:state_enabled="true" android:color="@android:color/holo_blue_dark" />
<item android:state_enabled="false" android:color="@android:color/darker_gray" />
</selector>
и примените его к обычной кнопке на
AppCompatActivity
<Button style="@style/Button_Primary"/>