У меня есть текстовая кнопка материала <Button android:id="@+id/button" style="@style/Widget.MaterialComponents.Button.TextButton"/>
, цвет которой я хотел бы изменить во время выполнения. Поэтому я установил цвет текста, используя button.setTextColor(Color.rgb(10, 10, 10))
. К сожалению, это не меняет рисуемый фон, поэтому, когда я нажимаю кнопку, цвет ряби не меняется. Я предполагаю, что мне нужно изменить фон на что-то вроде attackButton.background = getDrawable(R.drawable.ripple)
, но я не уверен, как заполнить ripple.xml
. Имеет ли этот метод смысл для изменения цвета и пульсации текста кнопки? Если да, то как мне написать ripple.xml
?
Как программно изменить стиль текстовой кнопки компонента материала в Android?
Ответы (3)
Чтобы изменить цвета в MaterialButton
, вы можете использовать:
button.setBackgroundTintList
для изменения оттенка фона. Вы должны использовать селектор.button.setRippleColor
, чтобы изменить цвет ряби. Также в этом случае вы должны использовать селектор (см. Ниже)button.setTextColor
, чтобы изменить цвет текста. Также в этом случае вы должны использовать селектор.
Это селектор по умолчанию, используемый в цвете ряби:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="@dimen/mtrl_low_ripple_pressed_alpha" android:color="?attr/colorPrimary" android:state_pressed="true"/>
<item android:alpha="@dimen/mtrl_low_ripple_focused_alpha" android:color="?attr/colorPrimary" android:state_focused="true" android:state_hovered="true"/>
<item android:alpha="@dimen/mtrl_low_ripple_focused_alpha" android:color="?attr/colorPrimary" android:state_focused="true"/>
<item android:alpha="@dimen/mtrl_low_ripple_hovered_alpha" android:color="?attr/colorPrimary" android:state_hovered="true"/>
<item android:alpha="@dimen/mtrl_low_ripple_default_alpha" android:color="?attr/colorPrimary"/>
</selector>
person
Gabriele Mariotti
schedule
24.02.2020
Спасибо :) Я забыл указать кнопку как MaterialButton, поэтому я не мог видеть эти методы!
(button as MaterialButton).rippleColor = getColorStateList(R.color.button_secondary)
. Кроме того, я установил альфу на 0,12, потому что альфы @dimen являются частными.
- person Courtney Pattison; 25.02.2020
Пробовали ли вы использовать RippleDrawable? Затем просто Button.setBackground() для другого ресурса или даже селектор а>xml. Если пульсации с селектором вам будет недостаточно, можно настроить саму маску пульсации
myRipple.xml
<ripple android:color="#ffff0000">
<item android:id="@android:id/myRippleMask"
android:drawable="@android:color/white" />
</ripple>
программно:
LayerDrawable myRipple = ContextCompat.getDrawable(context, drawable.myRipple.xml);
myRipple.setDrawableByLayerId(R.id.myRippleMask,Color.rgb(10, 10, 10));
каждая маска разного цвета
person
SHartley
schedule
22.02.2020
Одна строка программного кода без методов файлов ресурсов для textcolor, backgroundcolor и ripplecolor:
MaterialButton myMaterialButton = new MaterialButton(this);
myMaterialButton.setTextColor(Color.RED);
myMaterialButton.setBackgroundColor(Color.GRAY);
myMaterialButton.setRippleColor(ColorStateList.valueOf(Color.RED));
person
Androidcoder
schedule
19.07.2021