Android кнопка setColorFilter поведения - PullRequest
2 голосов
/ 18 апреля 2011

(я немного изменил вопрос, потому что теперь проблема немного яснее)

У меня есть 4 кнопки в моем приложении, и когда пользователь нажимает определенную кнопку, я меняю ее цвет.

когда нажата кнопка 3, я хочу изменить его цвет на зеленый, в противном случае я хочу удалить его зеленый фильтр (когда нажата кнопка 1/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 ]

5 голосов
/ 18 апреля 2011

Кажется, я помню, что у меня возникали проблемы при создании слишком большого количества ColorFilters. Это не звучит наверняка, как будто это то, что здесь виновато, так как это происходит прямо сейчас. Тем не менее, вы можете попробовать использовать фильтр в качестве переменной класса, а затем использовать его в блоке if / else. Кроме того, как упомянул Трев, поскольку вы просто хотите удалить зеленый фильтр, вы можете просто передать 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);
3 голосов
/ 25 мая 2012

Поведение по умолчанию при вызове setColorFilter(ColorFilter) на Drawable не делает автоматически недействительным Drawable, что означает, что оно не будет перерисовываться только в результате вызова метода.

Попробуйте вызвать d.invalidateSelf() после установки ColorFilter.

2 голосов
/ 19 апреля 2011

Вчера я опубликовал предложение об очень похожей проблеме, которую вы задали здесь:

поведение Android setColorFilter для кнопки

Похоже, что вы отредактировали исходный кодразмещены там, чтобы включить предложения, которые вам дали (без подтверждения ответов), а затем разместили точно такой же код в этом вопросе.

2 голосов
/ 18 апреля 2011

В документации Drawable, касающейся setColorFilter (ColorFilter cf), говорится, что для удаления любых существующих фильтров можно передать значение «ноль».Итак, может быть, после применения ПРОЗРАЧНОГО фильтра ваш последующий ЗЕЛЕНЫЙ фильтр не будет виден?Я не знаю достаточно о .setColorFilter и PorterDuff, чтобы знать наверняка, но это стоит попробовать.Возможно, попробуйте:

d.setColorFilter(null); 
d.setColorFilter(filter); 

Также вы можете вместо этого использовать этот метод:

setColorFilter(int color, PorterDuff.Mode mode) 
1 голос
/ 14 ноября 2014

Вам просто нужно изменить каждый чертеж перед установкой setColorFilter.

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

d = d.mutate();
d.setColorFilter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...