setSupportBackgroundTintList表示不起作用

时间:2015-12-02 10:48:58

标签: android android-appcompat

我创建了一个扩展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

我做错了什么?

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));