2016-06-02 2 views
4

Я использую библиотеку поддержки дизайна Google для Android. Для того, чтобы установить цвет кнопки, отличный от темы приложения Я объявляю кнопки в макете файл XML следующим образом:Установите buttonColorNormal программно для кнопки Android с эффектом дизайна AppCompat

<Button 
      style="@style/Widget.AppCompat.Button.Colored" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:theme="@style/MyButton" /> 

А затем определить MyButton в styles.xml, как

<style name="MyButton" parent="ThemeOverlay.AppCompat"> 
    <item name="colorButtonNormal">@color/my_color</item> 
</style> 

Это дает мне предоставляется кнопка в соответствии с библиотекой поддержки дизайна, причем цвет фона совпадает с цветом @color/my_color в моем файле colors.xml.

Следовательно, в основном используется android:theme, чтобы изменить атрибут colorButtonNormal, чтобы получить желаемый цвет.

Как я могу достичь того же результата программно? В принципе, если бы я мог сделать что-то вроде

myButton.setTheme(R.style.MyButton) 

... тогда я мог бы установить colorButtonNormal, чтобы получить представление.

Я не могу установить его как

myButton.setBackgroundColor(ContextCompat.getColor(getContext(),R.color.my_color)); 

или даже не как

ColorStateList colorStateList = ContextCompat.getColorStateList(getActivity(), R.color.my_color); 
ViewCompat.setBackgroundTintList(myButton, colorStateList); 

Это позволит удалить библиотеку эффект для поддержки проектов осязания.

+0

Вы попробовали использовать setBackgroundTintList? – JEY

+0

@JEY Последовал за документом, но он не работал. Обновлен вопрос для справки. – Tejas

+0

. Лучше всего создать кнопку программно с помощью одного из этих конструкторов: Button (Контекст, AttributeSet, int defStyleAttr) Кнопка (Контекст AttributeSet int defStyleAttr, int defStyleRes) – JEY

ответ

0

для кнопки я писал этот вспомогательный метод:

public static ColorStateList getButtonColorStateList(Context context, int accentColor) { 
    // get darker variant of accentColor for button pressed state 
    float[] colorHSV = new float[3]; 
    Color.colorToHSV(accentColor, colorHSV); 
    colorHSV[2] *= 0.9f; 
    int darkerAccent = Color.HSVToColor(colorHSV); 

    return new ColorStateList(
      new int[][] {{android.R.attr.state_pressed}, {android.R.attr.state_enabled}, {-android.R.attr.state_enabled}}, 
      new int[] { darkerAccent, accentColor, getColor(context, R.color.buttonColorDisabled) }); 
} 

accentColor является значением цвета для нормального включенного состояния. Для получения прессованного состояния используется более темный вариант accentColor и отключить состояние я определил цвет в значениях:

<color name="buttonColorDisabled">#dddddd</color> 

использовать этот метод:

mButton.setSupportBackgroundTintList(Utils.getButtonColorStateList(this, accentColor)); 

, где mButton является AppCompatButton и accentColor этого значения цвета.

Это работает для меня на Lollipop и выше с эффектом прикосновения и на предварительном Lollipop в качестве стандартного изменения цвета.

+0

@PetrDana. Удалил бы эффект пульсации, который у нас на кнопке, нажмите на Lollipop и выше? – Tejas

+0

@Tejas Эффект пульсации сохраняется. –

Смежные вопросы