Java 动态更改可绘制颜色

Java 动态更改可绘制颜色,java,c#,android,xamarin.android,android-drawable,Java,C#,Android,Xamarin.android,Android Drawable,在我的应用程序中,我有很多用xml文件定义的可绘图项。例如,我有一个按钮定义如下: button.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Bottom 3dp Shadow --> <item android:top="3dp"> <sh

在我的应用程序中,我有很多用xml文件定义的可绘图项。例如,我有一个按钮定义如下:

button.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Bottom 3dp Shadow -->
<item android:top="3dp">
    <shape android:shape="rectangle">
          <corners android:radius="3dp" />
          <solid android:color="@color/black_30" />   
    </shape>
</item>
<!-- green top color -->
<item android:top="3dp" android:bottom="3dp" android:id="@+id/background">
    <shape android:shape="rectangle">
        <corners android:radius="3dp" />
        <solid android:color="@color/green1" />           
    </shape>
 </item>
</layer-list>
好事情是它的工作。。。但是随机的。。。有时,当我再次显示按钮时,显示的仍然是原来的绿色。有时候,它是新的颜色。。。一旦我有了这两种行为中的一种,同一种颜色可以保持很多次,然后突然又变成了正确的颜色

有人能解释吗?drawables上是否有缓存会导致这种问题

3) 我在考虑第三种解决方案:动态更改
colors.xml
中定义的颜色(其中定义了
green1
),但这似乎不可能

事实上,对于2)一个非常简单的解决方案是:

不要尝试自定义来自xml文件的可绘制文件:

 LayerDrawable button = (LayerDrawable)Resources.GetDrawable(Resource.Drawable.normal_question_button);
GradientDrawable background = (GradientDrawable)button.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());
我们可以在获得每个按钮的实例后直接更改其颜色:

LayerDrawable buttonDrawable = _button.Background;
GradientDrawable background = (GradientDrawable)buttonDrawable.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());

您好,在我的导航抽屉图标(可绘制的内部图像视图)中,我使用setColorFilter方法。例如,如果我有一个100%不透明度的黑色图标,使用这种方法我可以得到一个100%不透明度的带有某种颜色的图标。将它与setImageAlpha或setAlpha相结合,我可以得到所有不透明度中所有颜色的所有图标。如果这对您有效,请告诉我添加一个答案。您是否尝试在外层Drawable上调用invalidateSelf()。@pskink:我尝试在两个Drawable上调用invalidateSelf(),但没有changes@Dahnark:如果我使用setColorFilter而不是setColor,我的按钮将不再有颜色<代码>background.SetColorFilter(新的PorterDuffColorFilter(Android.Graphics.Color.Red,PorterDuff.Mode.Multiply))否否,setColorFilter在第一种颜色上工作。我的图标是黑色的(它们是.png),然后setColorFilter将此平面黑色更改为其他平面颜色。
 LayerDrawable button = (LayerDrawable)Resources.GetDrawable(Resource.Drawable.normal_question_button);
GradientDrawable background = (GradientDrawable)button.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());
LayerDrawable buttonDrawable = _button.Background;
GradientDrawable background = (GradientDrawable)buttonDrawable.FindDrawableByLayerId(Resource.Id.background);
background.SetColor(Android.Graphics.Color.Red.ToArgb());