(我稍微改了一下这个问题,因为现在问题有点清楚了)
我的应用程序上有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);
}
答案 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