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