6

我有一个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()a Drawablefrom the TypedArray,即

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

这样做的主要缺点是它仅在 API 23+ 上可用。如果您想出更好的解决方案,请告诉我。

4

1 回答 1

1

我建议创建一个 custom View,您可以在其中获取pressedColor,defaultColordisabledColor从 xml。

以下代码适用于 Material 风格的按钮:

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);
}
于 2016-12-22T19:59:26.740 回答