我正在开发一个应用程序,其中包含一些通过 layout.xml 定义的按钮,如下所示
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/largebutton" >
</Button>
@drawable/largebutton 看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<gradient android:startColor="@color/menu_button_active_start" android:endColor="@color/menu_button_active_end" android:angle="270" />
<stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_stroke" />
<corners android:radius="@dimen/largebutton_radius" />
<padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
</shape>
</item>
<item android:state_focused="true" >
<shape>
<gradient android:startColor="@color/menu_button_focused_start" android:endColor="@color/menu_button_focused_end" android:angle="270" />
<stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_focused_stroke" />
<corners android:radius="@dimen/largebutton_radius" />
<padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
</shape>
</item>
.....
</selector>
除了不同状态下的渐变颜色外,所有属性,如填充、描边、半径都是相同的。我的问题是我的应用程序必须有更多样式。您可以将其想象为拥有颜色列表,并且当您选择一个应用程序时,会将所有颜色更改为选定的一种。因此,如果您有 20 种颜色,则 20 种不同的 xml 不是正确的方法。
所有 android:states 的 startColor 和 endColor 值都是从 Web 下载并保存到 DB 中的,我不知道其中有多少。
有没有办法实现这种行为?我搜索了所有论坛,大多数答案是不可能的。我找到了一个覆盖 colors.xml 的“解决方案”,但它似乎不是我的最佳解决方案。
所以我的问题是,我可以在colors.xml 中动态改变颜色吗?像这样的东西
List<Colors> colors = downloadColorsFromWeb();
Button b = new Button;
b.setDrawable(drawable.with(colors));
谢谢大家。
诺斯科。