Это должно быть что-то как это:
Вариант 1
public MyCustomView(Context context,
AttributeSet attrs,
int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
TypedArray typed = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, defStyleRes);
int resId = typed.getResourceId(R.styleable.MyCustomView_custom_attr, R.drawable.default_resourceId_could_be_color);
Drawable drawable = getMultiColourAttr(getContext(), typed, R.styleable.MyCustomView_custom_attr, resId);
// ...
Button mView = new Button(getContext());
mView.setBackground(drawable);
}
protected static Drawable getMultiColourAttr(@NonNull Context context,
@NonNull TypedArray typed,
int index,
int resId) {
TypedValue colorValue = new TypedValue();
typed.getValue(index, colorValue);
if (colorValue.type == TypedValue.TYPE_REFERENCE) {
return ContextCompat.getDrawable(context, resId);
} else {
// It must be a single color
return new ColorDrawable(colorValue.data);
}
}
Конечно, метод getMultiColourAttr() может быть не статическим и не защищенным, это зависит от проекта.
Идея состоит в том, чтобы получить некоторый resourceId для этого конкретного настраиваемого атрибута и использовать его только в том случае, если ресурс не является цветным, а TypedValue.TYPE_REFERENCE, что должно означать, что есть Drawable, который будет получен. Как только вы получите какой-нибудь Drawable, его следует легко использовать, например, как фона:
mView.setBackground (drawable);
Вариант 2
Глядя Вариант 1 Вы можете использовать один и тот же RESID но просто передать его Посмотреть метод setBackgroundResource (кубовые) и метод будет просто показать все, что остается позади этого ресурса - может быть вытяжка или цвет.
Надеюсь, это поможет. Спасибо
Почему этот принятый ответ? я не ответил на вопрос. Как вы определили, является ли вход «ссылкой» или «цветным»? – Moon
@Moon, метод 'getColor()' автоматически разрешает цвет. Документация по методу подсказывает, что: _ Вернуть значение цвета для атрибута по индексу. Если атрибут ссылается на ресурс цвета, содержащий сложный ColorStateList, возвращается цвет по умолчанию из набора ._ –