web-dev-qa-db-ja.com

プログラムでランタイムのチェックボックスcolorAccentを変更する

通常のチェックボックスビューを作成しています。

<CheckBox
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>

enter image description here

このライトグリーン(#A5D6A7)は、メインスタイルで定義されたアクセントカラーによるものです。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorAccent">@color/green_light</item>

実行時にこのスタイルを変更できないことはすでにわかっています: コードでcolorAccentを設定する方法は?

私がしたいのは、アプリ全体ではなく、特定のチェックボックスでこの色を変更することです。特定のアセットを作成せずにそれを行うことはできますか?ユーザーは実行時にこの色を変更できるためです。

ありがとう!

15
xpto

以下のコードは、checkbox.setSupportButtonTintList(colorStateList);のチェックとチェック解除の動作を遅くすることなくスムーズに機能します。一部のデバイスで予期しない動作をします

ColorStateList  colorStateList = new ColorStateList(
                        new int[][]{
                                new int[]{-Android.R.attr.state_checked}, // unchecked
                                new int[]{Android.R.attr.state_checked} , // checked
                        },
                        new int[]{
                                Color.parseColor("#cccccc"),
                                Color.parseColor("##cccccc"),
                        }
                );

 CompoundButtonCompat.setButtonTintList(checkBox,colorStateList)
18

使用 AppcompatCheckbox

 AppCompatCheckBox acb = (AppCompatCheckBox)findViewById(R.id.acb);
 ColorStateList colorStateList = new ColorStateList(
                new int[][]{

                     new int[]{-Android.R.attr.state_enabled}, //disabled
                     new int[]{Android.R.attr.state_enabled} //enabled
                },
                new int[] {

                     Color.RED //disabled
                     ,Color.BLUE //enabled

                }
        );

  acb.setSupportButtonTintList(colorStateList);
10

これは私のために働きます:

public void setCheckBoxColor(CheckBox checkBox, int checkedColor, int uncheckedColor) {
     int states[][] = {{Android.R.attr.state_checked}, {}};
     int colors[] = {checkedColor, uncheckedColor};
     CompoundButtonCompat.setButtonTintList(checkBox, new 
         ColorStateList(states, colors));
}

Lolllipop以上のAPIレベルの場合。以下をお試しください

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
 checkBox.buttonTintList = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.color_rose))
}
1
Raja Jawahar