2015-06-29 120 views
0

首先,我在这里阅读了关于此主题的多个主题。像PorterDuff colorfilter和改变setBackgroundResource的方法。他们都工作,但奇怪的打嗝完全随机发生。以编程方式更改按钮的颜色

我有以下的样式(未按状态=白,压=灰色)按钮:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <layer-list> 
      <item> 
       <shape> 
        <solid android:color="#ffafafaf" /> 
        <corners android:radius="30dip"/> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 
    <item> 
     <layer-list> 
      <!-- SHADOW LAYER --> 
      <item> 
       <shape> 
        <solid android:color="#66000000" /> 
        <corners android:radius="30dp"/> 
       </shape> 
      </item> 
      <!-- CONTENT LAYER --> 
      <item android:left="1dp" android:top="1dp" android:bottom="2dp" android:right="2dp"> 
       <shape> 
        <solid android:color="#ffffff" /> 
        <corners android:radius="30dp"/> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 
</selector 

>

因此,为了使这个按钮绿色而不是白色点击时我已经尝试了两种不同的方法。第一个

button.getBackground().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP); 

比,使其回到正常(白)我做的:

 Drawable d = button.getBackground(); 
     button.invalidateDrawable(d); 
     d.clearColorFilter(); 

这使按钮回到正常(白色),但是当我按下它不灰色(因为它在setColorFilter之前)而是绿色。不知何故,colorfilter被转移到按钮按下状态。

第二种方法。我创建了一个额外的可绘制的按钮样式相同,我的正常的,除了项目的颜色是绿色的(而不是白色) 所以用这个方法,我可以改变按钮的颜色是这样的:

b6.setBackgroundResource(R.drawable.green_button); 

我改回正常:

b6.setBackgroundResource(R.drawable.normal_button); 

这可以像预期的那样工作,除了当我尝试将按钮重置为正常时发生的奇怪行为(1/10)。该按钮变灰,看起来好像没有读取setBackgroundResource。这种情况都是随机发生的,logcat中没有任何东西可以废止。

请有人帮我弄清楚是什么原因导致这种情况或提出你的方法来做到这一点。我宁愿不使用带有与相对布局重叠按钮的文本框的图像按钮,而是通过更改imagebutton rsc来改变颜色。但请你有另一种方式吗?

+0

请详细说明StateList,我在google(“android”+“StateList”)上找不到关于它的东西。一些沉重的阅读,pskink,我尝试工作它槽,也许它以某种方式改变按钮按下状态,可以以某种方式删除 – user3711421

+0

@ user3711421你尝试创建一个自定义的'StateListDrawable'类吗? – pskink

+0

不,你会看着它。 – user3711421

回答

0

使您的按钮无效以强制刷新。

b6.invalidate(); 

那样你的按钮应该每次重画。

+0

忘了尝试这个,好主意,但没有说话。 – user3711421

相关问题