2017-02-09 1 views
0

related SO questionКак узнать значение пользовательского атрибута нескольких форматов?

Мы можем определить пользовательский атрибут нескольких типов.

<declare-styleable name="RoundedImageView"> 
    <attr name="cornerRadius" format="dimension|fraction"/> 
</declare-styleable> 

И я хочу использовать его следующим образом

<RoundedImageView app:cornerRadius="30dp"/> 
<RoundedImageView app:cornerRadius="20%"/> 

Как прочитать значение из него?


уровень API-21 предоставил API TypedArray.getType(index)

int type = a.getType(R.styleable.RoundedImageView_cornerRadius); 
if (type == TYPE_DIMENSION) { 
    mCornerRadius = a.getDimension(R.styleable.RoundedImageView_cornerRadius, 0); 
} else if (type == TYPE_FRACTION) { 
    mCornerRadius = a.getFraction(R.styleable.RoundedImageView_cornerRadius, 1, 1, 0); 
} 

Думаю, это рекомендуемое решение.

Но как это сделать с более низким уровнем API? Должен ли я использовать try catch?

Или, может быть, просто определить два атрибута ... cornerRadius и cornerRadiusPercentage ... Я пропущу border-radius в CSS.

+0

'TypedArray.getValue (...)' + 'TypedValue.type'? – Selvin

+0

@Selvin Я пытаюсь ваше решение. Я думаю, это сработает. Благодарю. – Moon

+0

@Selvin Вы можете отправить ответ. Я соглашусь. – Moon

ответ

0

Спасибо за комментарий @ Selvin. Вы можете использовать TypedArray.getValue(...) + TypedValue.type. Вы можете найти тип константы here

TypedValue tv = new TypedValue(); 
a.getValue(R.styleable.RoundedImageView_cornerRadius, tv); 
if (tv.type == TYPE_DIMENSION) { 
    mCornerRadius = tv.getDimension(getContext().getResources().getDisplayMetrics()); 
} else if (tv.type == TYPE_FRACTION) { 
    mCornerRadius = tv.getFraction(1, 1); 
    mUsePercentage = true; 
} 
+0

Почему не 'mCornerRadius = tv.getFraction (1,1);' и 'mCornerRadius = tv.getDimension (getContext(). GetResources(). GetDisplayMetrics());'? – Selvin

+0

@Selvin Спасибо! Я спешил с работы ... Обновлено. – Moon

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

  • Нет связанных вопросов^_^