2017-02-09 49 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嗎?

或者,也許只是定義兩個屬性... cornerRadiuscornerRadiusPercentage ...我想在CSS中錯過border-radius

+0

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

+0

@Selvin我正在嘗試你的解決方案。我認爲它會起作用。謝謝。 – Moon

+0

@Selvin你可以發表一個答案。我會接受它。 – Moon

回答

0

感謝@ Selvin的評論。您可以使用TypedArray.getValue(...)​​。你可以找到類型常量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

相關問題