2015-01-27 3 views
3

я прочитал в другом ответе, что в Android вы можете объявить атрибуты для настраиваемого представления, которые имеют множество форматов, как это:Как получить доступ к настраиваемому атрибуту с несколькими форматами?

<attr name="textColor" format="reference|color"/> 

, как я могу получить доступ этих атрибутов в моем классе? Должен ли я считать это ссылкой, используйте getResources().getColorStateList(), а затем предположите, что это необработанный цвет RGB/ARGB, если Resources.getColorStateList() throws Resources.NotFoundException или есть лучший способ разграничения между форматами/типами?

ответ

1

Это должно быть что-то как это:

Вариант 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 (кубовые) и метод будет просто показать все, что остается позади этого ресурса - может быть вытяжка или цвет.

Надеюсь, это поможет. Спасибо

0

В вашем /res/attrs.xml:

<declare-styleable name="YourTheme"> 
    <attr name="textColor" format="reference|color"/> 
</declare-styleable> 

В пользовательском конструкторе вид, попробовать что-то вроде этого (я не запускать его):

int defaultColor = 0xFFFFFF; // It may be anyone you want. 
TypedArray attr = getTypedArray(context, attributeSet, R.styleable.YourTheme); 
int textColor = attr.getColor(R.styleable.YourTheme_textColor, defaultColor); 
+0

Почему этот принятый ответ? я не ответил на вопрос. Как вы определили, является ли вход «ссылкой» или «цветным»? – Moon

+0

@Moon, метод 'getColor()' автоматически разрешает цвет. Документация по методу подсказывает, что: _ Вернуть значение цвета для атрибута по индексу. Если атрибут ссылается на ресурс цвета, содержащий сложный ColorStateList, возвращается цвет по умолчанию из набора ._ –

Смежные вопросы