1

我有这样的:在xml中为按钮定义自定义形状。现在我想动态改变颜色。怎么样?

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" /> 

动态,我想改变背景颜色(这在ro中定义und_button xml以编程方式。有什么办法可以做到这一点?

+0

我相信不是。如果你改变颜色,它将取代背景。无论您想要更改哪种颜色,都必须使用不同颜色的第二种XML,并且您可以在Java –

+0

@ th3pat3l Wow中将该XML更改为背景。 Bravo Google,使用您的SDK进行操作非常简单。 –

+0

你想改变特定事件的背景颜色吗?例如,当按钮被点击时,当按钮被聚焦或者按钮被徘徊时?什么是实际使用? –

回答

0

我解决它通过设置ColorFilter:

Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); 
mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY)); 
myButton.setResource(mDrawable); 
-1

您可以根据需要使用的颜色构造代码中的形状,并从中创建StateListDrawable并将其设置为按钮背景。

+0

我解决了我自己的问题,但是如果你解释你的答案并给出一个例子,我会给你一个+1 –

2

如果要定义某些状态为您的按钮,你可以将它们都在XML中,而不必做编程方式(如果你做,你确实可以设置一个过滤器,但如果你有很多状态和条件,它会变得混乱)。

我会在这里详细的步骤:你想

您可以在绘制文件夹中创建一个选择器的XML与定义的状态

1)创建与状态的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(布尔),它将承担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+,你可以通过在你的可绘制-V21夹中其他button_bkg.xml文件中定义一个连锁反应,这将是这个样子是很重要的:

button_bkg.xml(在绘制-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(在绘制-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到您的绘制-V21夹文件。就我而言,bkg_is_default和bkg_is_disabled.xml对于21+和21-API都是相同的,所以我没有将它添加到我的drawable-v21文件夹中,我只是在可绘制文件夹中创建它。

我想强调一下,你仍然需要其他文件在您的常规可绘制文件夹,以便设备与API 21 - 将正常工作。

3)分配这样的背景下,以你的按钮

最后,你只需要定义背景的按钮:

<Button 
    ... 
    android:background="@drawable/button_bkg 
/> 

所以,你有它。这样,您不需要以编程方式设置样式,只需在xml文件中定义所有背景(根据您的状态)即可。 但是,如果您还希望以编程方式设置它们,则可以使用setBackground并使用您定义的xml文件并应用所需的状态逻辑(如果按下按钮,则setBackground(bkg_is_pressed)等) )

我希望有帮助,让我知道如果这对你有用。

+0

@AbAppletic你对我的例子有什么看法,对你有用吗?如果是这样,请记住将它备份以供将来参考:)干杯! – FabioR