Как программно изменить стиль текстовой кнопки компонента материала в Android?

У меня есть текстовая кнопка материала <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?


person Courtney Pattison    schedule 22.02.2020    source источник


Ответы (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
comment
Спасибо :) Я забыл указать кнопку как MaterialButton, поэтому я не мог видеть эти методы! (button as MaterialButton).rippleColor = getColorStateList(R.color.button_secondary). Кроме того, я установил альфу на 0,12, потому что альфы @dimen являются частными. - person Courtney Pattison; 25.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