Добавьте? Attr/selectableItemBackground для просмотра и установите цвет фона

У меня есть View что я создал программно, и я хочу иметь волновой эффект, когда я выбираю его. Я смог заставить это работать, используя ?attr/selectableItemBackground, Тем не менее, я также хочу установить цвет фона View когда я выберу это. я пробовал setBackgroundResource(selectableAttr) а потом setBackgroundColor(colorSelectBackground), но цвет, кажется, перезаписывает ресурс, поэтому у меня есть только один или другой. Вот мой код:

int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int backRes = typedArray.getResourceId(0, 0);

public void select() {
    view.setSelected(true);
    view.setBackgroundResource(backRes);
    view.setBackground(colorSelectBackground);
}

public void deselect() {
    view.setSelected(false);
    view.setBackground(colorSelectBackground);
}

Кто-нибудь знает, как я могу использовать оба ?attr/selectableItemBackground а также установить цвет фона? Спасибо!

РЕДАКТИРОВАТЬ: Чтобы уточнить, рассматриваемый вид не кнопка, это RelativeLayout,

ОБНОВЛЕНИЕ: я действительно никогда не находил хорошее решение для этого. Самое близкое, которое я получил, использовало View.setForeground() к Drawable от TypedArrayт.е.

view.setForeground(typedArray.getDrawable(0));

Основным недостатком этого является то, что он доступен только на API 23+. Дайте мне знать, если вы найдете лучшее решение.

1 ответ

Я бы порекомендовал создать кастом Viewгде вы можете получить pressedColor, defaultColor а также disabledColor из XML.

Следующий код будет работать для кнопки в стиле Материал:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
    ColorStateList colorStates = new ColorStateList(
            new int[][]{
                    new int[]{android.R.attr.state_pressed},
                    new int[]{}
            },
            new int[]{
                    pressedColor,
                    defaultColor});

    view.setBackgroundDrawable(isEnabled ? new RippleDrawable(colorStates, getBackground(), getBackground())
            : new ColorDrawable(disabledColor);
}
else
{
    StateListDrawable backgroundDrawable = new StateListDrawable();
    backgroundDrawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(isEnabled ?
            pressedColor : disbledColor));
    backgroundDrawable.addState(StateSet.WILD_CARD, new ColorDrawable(isEnabled ? defaultColor :
            disabledColor));
    view.setBackgroundDrawable(backgroundDrawable);
}
Другие вопросы по тегам