我创建了一个扩展AppCompat按钮的MyButton类。在我的onstructors中,我执行此代码:
int[][] states = new int[][]{
new int[]{android.R.attr.state_enabled}, // enabled
new int[]{android.R.attr.state_pressed} // pressed
};
int[] colors = new int[]{
ContextCompat.getColor(context, R.color.tint),
ContextCompat.getColor(context, R.color.primary),
};
setSupportBackgroundTintList(new ColorStateList(states, colors));
不幸的是,各州都没有工作。该按钮仅显示启用的颜色。我正在使用最新的appcompat库并尝试使用较旧的库
compile 'com.android.support:appcompat-v7:23.1.1' //also tried 23.0.1
compile 'com.android.support:design:23.1.1' //also tried 23.0.1
我做错了什么?
答案 0 :(得分:4)
各州按照定义的顺序进行匹配。因此,android.R.attr.state_enabled
将在 android.R.attr.state_pressed
之前与匹配。
由于该按钮已启用,因此第一个肯定匹配将针对android.R.attr.state_enabled
,并且将选择颜色ContextCompat.getColor(context, R.color.tint)
。由于已找到正匹配,按下按钮是否无关紧要。
排除这种情况的最快方法是在android.R.attr.state_pressed
之前放置android.R.attr.state_enabled
。状态匹配将如下:
按钮当前已按下 - >将检查状态android.R.attr.state_pressed
并找到肯定匹配 - >将使用颜色ContextCompat.getColor(context, R.color.primary)
。
按钮当前未按下 - >状态android.R.attr.state_pressed
将被检查,检查将失败 - >将检查状态android.R.attr.state_enabled
并找到肯定匹配 - >将使用颜色ContextCompat.getColor(context, R.color.tint)
。
这应该有效:
int[][] states = new int[][]{
new int[]{android.R.attr.state_pressed}, // pressed
new int[]{android.R.attr.state_enabled} // enabled
};
int[] colors = new int[]{
ContextCompat.getColor(context, R.color.primary),
ContextCompat.getColor(context, R.color.tint)
};
setSupportBackgroundTintList(new ColorStateList(states, colors));