坏消息
如BoD所说,在Lollipop 5.0(API级别21)中给按钮着色是没有意义的。
好消息
Lollipop 5.1(API级别22)似乎通过更改btn_mtrl_default_shape.xml(以及其他文件)来解决了这个问题:https://android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E!/#F0
绝佳消息
新的支持库(版本22.1+)为许多组件添加了向后兼容的着色支持,包括AppCompatButton!
不幸的是,android:backgroundTint
属性仍然无法使用(也许我做错了什么)——因此,您必须在代码中设置 ColorStateList
,使用 setSupportBackgroundTintList()
。希望将来能够支持 android:backgroundTint
。 更新:Marcio Granzotto评论说,在 AppCompatButton 上可以使用 app:backgroundTint
!请注意,它是 app:
而不是 android:
,因为它位于应用程序/库中。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<AppCompatButton
android:id="@+id/mybutton"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Testing, testing"
app:backgroundTint="#ff00ff"/>
</LinearLayout>
如果您让活动继承自AppCompatActivity
,则它将自动膨胀一个AppCompatButton
而不是普通的Button
。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
v.setSupportBackgroundTintList(csl);
}
}
您当然应该从颜色资源中获取ColorStateList,但我有点懒,所以...请注意要将您的应用程序主题基于其中一个Theme.AppCompat主题,否则兼容视图会非常难过...;)这适用于2.3.7(姜饼MR1)和5.0(棒棒糖“经典”)。