2016-09-06 141 views
2

我有一个切换按钮的选择器被选中和未选中 - 有没有一种方法可以使用带有形状的自定义图层列表并使用不同的颜色?我在运行时添加它们,但使用XML作为设计。多次使用可绘制但具有不同颜色

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_checked="true" android:drawable="@drawable/toggle_custom"/> 
<item android:state_checked="false" android:drawable="@drawable/toggle_custom_off"/> 
</selector> 

而且我toggle_custom和toggle_custom_off

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/mainColourOn"> 
    <shape android:shape="rectangle" /> 
</item> 
<item android:bottom="10dp"> 
    <shape android:shape="rectangle"> 
     <solid android:color="#E6FFFFFF"/> 
    </shape> 
</item> 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/mainColourOff"> 
    <shape android:shape="rectangle"/> 
</item> 
<item android:bottom="10dp"> 
    <shape android:shape="rectangle"> 
     <solid android:color="#FFF"/> 
    </shape> 
</item> 

 LayerDrawable layerOn = (LayerDrawable) getResources().getDrawable(R.drawable.toggle_custom, getTheme()); 

     LayerDrawable layerOff = (LayerDrawable) getResources().getDrawable(R.drawable.toggle_custom_off, getTheme()); 

     GradientDrawable toggleOn = (GradientDrawable) layerOn.findDrawableByLayerId(R.id.mainColourOn); 
     GradientDrawable toggleOff = (GradientDrawable) layerOff.findDrawableByLayerId(R.id.mainColourOff); 

     int colour = persons.get(i).getColour(); 

     toggleOn.mutate(); 
     toggleOff.mutate(); 
     toggleOn.setColor(colour); 
     toggleOff.setColor(colour); 

因此,例如,已经使用蓝色使用一个切换正在使用红色和另一相同的XML。由于

回答

1

可以重新使用该图层列表Drawable XML并创建StateListDrawable每个ToggleButton程序是这样的:

void setToggleButtonColor(ToggleButton tButton, int colour) 
{ 
    LayerDrawable layerOn = (LayerDrawable) ContextCompat.getDrawable(this, R.drawable.toggle_custom); 
    layerOn.mutate(); 
    LayerDrawable layerOff = (LayerDrawable) ContextCompat.getDrawable(this, R.drawable.toggle_custom_off); 
    layerOff.mutate(); 
    Drawable toggleOn = layerOn.findDrawableByLayerId(R.id.mainColourOn); 
    Drawable toggleOff = layerOff.findDrawableByLayerId(R.id.mainColourOff); 

    toggleOn.setColorFilter(colour, PorterDuff.Mode.MULTIPLY); 
    toggleOff.setColorFilter(colour, PorterDuff.Mode.MULTIPLY); 

    StateListDrawable tbBackground = new StateListDrawable(); 

    tbBackground.addState(new int[]{android.R.attr.state_checked}, layerOn); 
    tbBackground.addState(StateSet.WILD_CARD, layerOff); 

    tButton.setBackgroundDrawable(tbBackground); 

} 

让我们两个的ToggleButtons测试:

ToggleButton toggleButton1 = (ToggleButton) findViewById(R.id.togglebutton1); 
toggleButton1.setChecked(true); 

ToggleButton toggleButton2 = (ToggleButton) findViewById(R.id.togglebutton2); 
toggleButton2.setChecked(true); 

setToggleButtonColor(toggleButton1, ContextCompat.getColor(this, R.color.blue)); 
setToggleButtonColor(toggleButton2, ContextCompat.getColor(this, R.color.magenta)); 

enter image description here

+0

它的工作原理!谢谢,非常感谢!只需将'Mode.MULTIPLY'更改为'Mode.SRC',因为我没有使用预设颜色,而是使用int值。 –

相关问题