2012-10-06 81 views
2

目前我開始致力於支持一個項目,在那裏我發現了一個非常有趣的技巧。它提供了一個機會,不要在xml中爲CustomView編寫完整的類名,它看起來很髒,我想。CustomView安全嗎?

下面是此招的實現步驟:

1)在我們的項目中創建我們自己的android.view包。

2)創建CustomTextView extends TextView並將其放入android.view包中。

3)使用它的XML像任何其他Android view

<CustomTextView 
    android:angle="90" 
    android:endColor="#efa600" 
    android:paddingLeft="0dp" 
    android:startColor="#ffe396" 
    android:text="" 
    android:textSize="24dp" 
    android:textStyle="bold" /> 

4)使用標準Android屬性,而不是定製:

public CustomTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    int[] ids = new int[attrs.getAttributeCount()]; 
    for (int i = 0; i < attrs.getAttributeCount(); i++) { 
     ids[i] = attrs.getAttributeNameResource(i); 
    } 

    TypedArray a = context.obtainStyledAttributes(attrs, ids, defStyle, 0); 

    for (int i = 0; i < attrs.getAttributeCount(); i++) { 
     String attrName = attrs.getAttributeName(i); 
     if (attrName == null) 
      continue; 

     if (attrName.equals("startColor")) { 
      mStartColor = a.getColor(i, -1); 
     } else if (attrName.equals("endColor")) { 
      mEndColor = a.getColor(i, -1); 
     } else if (attrName.equals("angle")) { 
      mAngle = a.getFloat(i, 0); 
     } 
    } 
    a.recycle(); 
} 

請問這樣的方式是安全的或者它會導致任何問題?

+0

爲什麼你想讓自己複雜化並使用一些未公開的行爲只是爲了不將自定義視圖的包名鍵入? – Luksprog

+0

這不是我的代碼,我只是支持它,我想知道任何可能的問題。 – Evos

回答

1

雖然可以做到,但我會推薦使用自己的風格。

我不確定會發生什麼,如果這些被刪除的未來,如果他們會被Inflater忽略,因爲他們不是有效的樣式。

最少要說它會讓您輕鬆使用自定義樣式。

更不用說更清潔的代碼了。

+0

是的。在'styles.xml'文件中放置默認值並在需要時重載屬性會更好。 – DeeV

+0

是的,我認爲你就在這裏。它的工作原理,但只爲現在。這種代碼風格是發佈版本無法接受的。 – Evos