我有这个:
round_button.xml
<xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="oval">
<solid android:color="#dec60000"/>
<size android:width="150dp" android:height="150dp"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="oval">
<solid android:color="#860000"/>
<size android:width="150dp" android:height="150dp"/>
</shape>
</item>
我的按钮:
<Button
android:id="@+id/incrementBTN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@drawable/round_button"
android:onClick="onClick"
android:soundEffectsEnabled="true"
android:text="0"
android:textSize="50sp"
tools:ignore="HardcodedText" />
动态地,我想要以编程方式更改背景颜色(在round_button xml 中定义)。有没有办法可以做到这一点?
答案 0 :(得分:2)
如果你想为你的按钮定义某些状态,你可以在xml中设置它们,而不必以编程方式设置它们(如果你这样做,你确实可以设置一个过滤器,但它可以如果你有很多国家和条件IMO,那就太乱了。
我将详细介绍这里的步骤:
1)创建具有所需状态的xml
您可以使用已定义状态在drawable文件夹中创建带有选择器的xml。例如,
<强> button_bkg.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bkg_is_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false"/>
<item android:drawable="@drawable/bkg_default"/>
</selector>
我们将此文件称为 button_bkg.xml 。在上面的例子中,我列出了3种状态:按下,禁用和默认,这意味着,当按下按钮时,它将采用bkg_is_pressed背景,当我将按钮设置为禁用时(无论是在xml中还是以编程方式通过setEnabled(boolean),它都将采用bkg_is_disabled背景。
2)创建背景
现在,您将定义背景在您定义的xml文件中的内容(bkg_is_pressed,bkg_is_default,bkg_is_pressed)。在您的情况下,例如,您将获取round_button.xml文件中定义的每个形状,并将它们分成您为状态定义的每个xml文件。就我而言,我定义了一个图层列表:
<强> bkg_is_pressed.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/button_corner_radius"/>
<solid android:color="@color/color_alert"/>
<stroke
android:width="@dimen/universal_1_pixel"
android:color="@color/color_gray_dark"/>
</shape>
</item>
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/button_corner_radius"/>
<solid android:color="@color/color_mask_highlighted"/>
</shape>
</item>
</layer-list>
你会为每个州做到这一点。
重要的是要注意,如果您要为API 21+构建,可以通过在drawables-v21文件夹中创建ANOTHER button_bkg.xml文件来定义涟漪效果,如下所示:
button_bkg.xml(在drawable-v21文件夹中)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false" />
<item android:drawable="@drawable/bkg_is_pressed" />
要使用纹波,您可以按照以下说明定义颜色:
bkg_is_pressed.xml (在您的drawable-v21文件夹中)
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/color_mask_highlighted">
<item android:drawable="@drawable/bkg_is_default" />
</ripple>
您只需将button_bkg.xml和bkg_is_pressed.xml放入drawable-v21文件夹文件中即可。就我而言,21 +和21- API的bkg_is_default和bkg_is_disabled.xml是相同的,所以我没有将它添加到我的drawable-v21文件夹中,我只是在drawable文件夹中创建它。
我想强调您 STILL 需要常规drawable文件夹中的其他文件,以便具有API 21的设备能够正常运行。
3)将该背景分配给按钮
最后,您只需要为按钮定义背景:
<Button
...
android:background="@drawable/button_bkg
/>
所以,你有它。这样,您不需要以编程方式设置样式,只需在xml文件中定义所有背景(根据您的状态)。 但是,如果你也喜欢以编程方式设置它们,你也可以这样做,只需使用setBackground并使用你定义的xml文件并应用你想要的状态逻辑(如果按下按钮,setBackground(bkg_is_pressed)等等) )
我希望有帮助,请告诉我这是否适合您。
答案 1 :(得分:1)
我通过设置ColorFilter来解决它:
Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons);
mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
myButton.setResource(mDrawable);
答案 2 :(得分:-1)
您可以根据需要使用的颜色从代码构造形状,从中创建StateListDrawable并将其设置为按钮背景。