тонировка CheckBox и RadioButton на Android - PullRequest
2 голосов
/ 15 ноября 2011

У меня есть Android-приложение для астрономии, где мне нужно красить пользовательский интерфейс для использования ночью.Хотя у меня есть схема, которая хорошо работает для многих (большинства ??) элементов пользовательского интерфейса, у меня возникают проблемы с CompoundButtons: CheckBox и RadioButton.

Основная идея состоит в том, чтобы извлечь Drawable для элемента UI иесли он есть, чтобы установить цветной фильтр на него.Моя проблема заключается в поиске подходящего Drawable для составных кнопок.Я бы подумал, что getCompoundDrawables () был бы тем, что мне нужно, но возвращаемый массив для 4 drawables всегда содержит нулевые значения для 4 элементов.

Вот рекурсивный код, который я вызываю в представлении верхнего уровня дляпопытайтесь раскрасить элементы пользовательского интерфейса.

public static void setNightVisionBkg( View view )
{
    if ( view instanceof ViewGroup )
    {
        Drawable drawable = view.getBackground();
        if ( drawable != null )
            drawable.setColorFilter( 0xFFAA0000, PorterDuff.Mode.MULTIPLY );

        ViewGroup group = (ViewGroup) view;
        int numChildren = group.getChildCount();
        for ( int i = 0; i < numChildren; i++ )
        {
            View v = group.getChildAt( i );
            Drawable d = v.getBackground();
            if ( d != null )
                d.setColorFilter( 0xFFAA0000, PorterDuff.Mode.MULTIPLY );

            if ( v instanceof ViewGroup )
            {
                setNightVisionBkg( (ViewGroup) v );
            }
            else if (v instanceof CompoundButton)
            {
                CompoundButton compBtn = (CompoundButton)v;
                Drawable drawables[] = compBtn.getCompoundDrawables();
                for (int j = 0; j < drawables.length; j++)
                if (drawables[j] != null)
                {
                    drawables[j].setColorFilter( 0xFFAA0000, PorterDuff.Mode.MULTIPLY );
                }
            }
        }
    }
}

Обратите внимание, что это последняя часть, где он получает Drawables для CompoundButton, который не работает (все Drawables имеют значение null).

Anyмысли о том, как это сделать?Я знаю, что могу установить свои собственные рисунки, но я бы предпочел использовать стандартные и просто установить colorFilter, если это возможно.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Я решил свою проблему немного по-другому. Закончилось создание подклассов CheckBox (и RadioButton). В подклассе я переопределяю:

protected boolean verifyDrawable( Drawable drawable )

и в этом методе я установил colorFilter для рисования. Прекрасно работает.

0 голосов
/ 15 ноября 2011

Вы не выполняете "нормальные" просмотры без ViewGroup. Кроме того, ваше тестирование для ViewGroup в цикле for, который можно запускать ТОЛЬКО, если представление является ViewGroup.

...