Android按钮setColorFilter行为

时间:2011-04-18 12:00:04

标签: android button

(我稍微改了一下这个问题,因为现在问题有点清楚了)

我的应用程序上有4个按钮,当用户点击某个按钮时 我改变了那个按钮的颜色。

单击按钮3时我想将其颜色更改为绿色,否则我想删除他的绿色滤镜(单击button1 / 2/4时)。 如果我点击按钮3它确实得到绿色过滤器。如果那时我单击按钮4它将删除绿色过滤器,但如果我单击按钮1或2,则没有任何反应。 当我在XML中切换按钮的位置,并将button3放在第一位时,它没有发生,想法?

布局xml的相关部分是:

<Button
android:id="@+id/ans1"
android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/>
<Button
android:id="@+id/ans2"
android:layout_width="fill_parent" 
     android:layout_height="wrap_content" />
<Button
android:id="@+id/ans3"
android:layout_width="fill_parent" 
     android:layout_height="wrap_content" />
<Button
android:id="@+id/ans4"
android:layout_width="fill_parent" 
     android:layout_height="wrap_content" />

代码是:

if (answer.equals("3")) 
    {
        question.setText("In if");
        d.setColorFilter(filter); 
    }
    else
    {
        question.setText("else");
        d.setColorFilter(null);
    }

5 个答案:

答案 0 :(得分:5)

我似乎记得以前创建太多ColorFilters时遇到问题。这听起来并不是肯定的,因为它正在发生。不过,您可能会尝试将过滤器作为类变量,然后在if / else块中使用它。另外,正如Trev所提到的,因为你只是想删除绿色过滤器,你可以将null传递给setColorFilter并避免使用透明过滤器,所以你最终会得到这样的结果:

//in main class
PorterDuffColorFilter greenFilter = 
    new PorterDuffColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP);

//in CheckAnswer()
Drawable d = findViewById(R.id.ans2).getBackground();

if(answer.equals("1") d.setColorFilter(greenFilter)
else d.setColorFilter(null);

答案 1 :(得分:3)

setColorFilter(ColorFilter)上调用Drawable时的默认行为不会自动使Drawable无效,这意味着它不会仅仅因为方法调用而重绘自身。

设置d.invalidateSelf()后尝试拨打ColorFilter

答案 2 :(得分:2)

答案 3 :(得分:2)

昨天我发布了一个问题,你在这里问了一个非常类似的问题:

Android button setColorFilter behaviour

您似乎已经编辑了最初在那里发布的代码,以便合并您给出的建议(未确认答案),然后在此问题中发布完全相同的代码。

答案 4 :(得分:1)

你只需要在setColorFilter之前改变每个drawable。

Drawable d = findViewById(R.id.ans2).getBackground();

d = d.mutate();
d.setColorFilter