2017-03-03 36 views
0

顏色選擇器設置複選框的顏色,我在我的Android應用程序有一個顏色選擇器設置屬性buttonTintCheckbox,使其變色,當它被選中/取消。與Android的

這裏是我的複選框風格的XML:

<style name="standard_checkbox"> 
    <item name="android:layout_marginLeft">@dimen/checkbox_small_margin</item> 
    <item name="android:layout_marginRight">@dimen/checkbox_small_margin</item> 
    <item name="buttonTint">@color/checkbox_standard_selector</item> 
</style> 

這裏是我的XML的選擇:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:color="@color/checkbox_checked" /> 
    <item android:state_checked="false" android:color="@color/checkbox_unchecked" /> 
</selector> 

但它不能正常工作。當第一個(灰色)變爲可見時,Checkbox具有正確的顏色。點擊/選中時,它會變成綠色。但是當它再次未被檢查時,由於某種原因它仍然是綠色的。

我希望有人能看到什麼可能是錯誤的。任何幫助將不勝感激。

編輯: 這個問題也可能是由我在清單中選擇主題引起的。我使用這個自定義主題:

<style name="Theme.Transparent.NoActionBar" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
</style> 
+0

你如何處理顏色檢查和取消勾選? –

+0

使用選擇器,在複選框的不同狀態下定義不同的顏色(android:state_checked = true/false) – Langkiller

+0

我的意思是在onCheck更改的方法中? –

回答

0

我找到了一個解決方案,它基於rafsanahmad007發佈的部分代碼。我使用偵聽器創建了自定義複選框視圖,根據自己的狀態(選中與否)更改了色調顏色。

代碼爲我的自定義視圖:

import android.content.Context; 
import android.content.res.ColorStateList; 
import android.graphics.Color; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.widget.CompoundButtonCompat; 
import android.util.AttributeSet; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 

public class CustomCheckBox extends CheckBox implements CompoundButton.OnCheckedChangeListener { 

    private OnCheckedChangeListener listener; 
    private int currentColor; 

    public CustomCheckBox(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     super.setOnCheckedChangeListener(this); 
     setCheckboxColor(); 
    } 

    private void setCheckboxColor() { 
     ColorStateList colorStateList = new ColorStateList(
       new int[][]{ 
         new int[]{android.R.attr.state_enabled}, 
       }, 
       new int[]{ 
         getCurrentColor() 
       } 
     ); 
     CompoundButtonCompat.setButtonTintList(this, colorStateList); 
    } 

    @Override 
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 
     this.listener = listener; 
    } 

    public int getCurrentColor() { 
     if (isChecked()) { 
      return ContextCompat.getColor(getContext(), R.color.checkbox_checked); 
     } else { 
      return ContextCompat.getColor(getContext(), R.color.checkbox_unchecked); 
     } 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     setCheckboxColor(); 
     if (listener != null) { 
      listener.onCheckedChanged(buttonView, isChecked); 
     } 
    } 
} 

我希望這能幫助別人用相同或類似的問題。

1

試試下面的代碼:以programetically改變checkbox按鈕背景

CheckBox cb = (CheckBox) findViewById(R.id.checkbox); 
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      buttonView.setBackgroundColor(getResources().getColor(R.color.checked)); 
      } 
     if (!isChecked) { 
      buttonView.setBackgroundColor(getResources().getColor(R.color.unchecked)); 
      } 
    } 
}); 

NB:getColor()已被棄用ü需要使用ContextCompat.getColor(context, R.color.color)

第二種方式

創建你的顏色的一個colorlist變量設置

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("#FFFFFF"), //unchecked color 
       Color.parseColor("#009000"), //checked color 
     } 
); 

設置使用顏色:setButtonTintList()

CheckBox cb = (CheckBox) findViewById(R.id.checkbox); 
CompoundButtonCompat.setButtonTintList(cb,colorStateList); 
+0

有人'胖腦子'downvoting工作答案沒有一個正當的理由..承擔了良好的工作.. – rafsanahmad007

+0

至少顯示出勇於找出問題的答案.... – rafsanahmad007

+0

非常感謝!我不知道爲什麼有人downvoted(不是我) ,但如果這是唯一的解決方案,我將不得不實現我自己的觀點,擴展複選框並使用上面的代碼。我會嘗試一下並回復你。現在,請把我的upvote請:) – Langkiller

0

我有同樣的問題,因爲你,突然有想法。爲什麼不使用選擇器。所以我嘗試了自己,並且它工作。

解決方案:

在res文件夾創建色彩文件夾,如果你沒有一個,並把這個顏色選擇

checkbox_selector

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:color="@color/colorPrimary" /> 
    <item android:state_checked="false" android:color="@color/colorSecondary" /> 
</selector> 

而且你的複選框內:

app:buttonTint="@color/checkbox_selector" 
+0

它不適合我......但是謝謝。這可能與我選擇的主題有關(請參閱我對該問題的編輯) – Langkiller