使用AppCompat的设计效果以编程方式为Android按钮设置buttonColorNormal

我一直在使用
Android的Google设计支持库.为了设置与app主题不同的按钮的颜色,我在布局XML文件中声明了Button,如下所示:

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

然后将styles.xml中的MyButton定义为

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

这给了我一个按照设计支持库的按钮,背景颜色是我在colors.xml文件中用@ color / my_color定义的背景颜色.

因此,基本上它是使用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);

这将删除触摸的设计支持库效果.

最佳答案 对于Button我写了这个帮助方法:

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及以上版本,具有触感和前棒棒糖作为标准颜色变化.

点赞