Добавьте? 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);
}