2012-08-22 54 views
11

所以這裏是我的問題:我創建了一個自定義組件,它擴展了Button這個按鈕有一個屬性叫做testAttr使用自定義屬性創建默認樣式

<declare-styleable name="TestButton" parent="@android:style/Widget.Button"> 
    <attr name="testAttr" format="reference|color"/> 
</declare-styleable> 

我想創建一個默認樣式此組件所以我說這一點:

<declare-styleable name="TestTheme"> 
    <attr name="testStyle" format="reference"/> 
</declare-styleable> 

<style name="Theme.AppTheme" parent="@android:style/Theme" > 
    <item name="testStyle">@style/test</item> 
</style> 

的問題是,我希望同時使用Android的屬性和我自己就是這樣,這是不工作:

<style name="test" parent="@android:style/Widget.Button"> 
    <item name="android:background">#FF0000</item> 
    <item name="testAttr">testText</item> 
</style> 

我設置在我的自定義組件的默認樣式如下:

public myButton(final Context context) { 
    this(context, null); 
} 

public myButton(final Context context, final AttributeSet attrs) { 
    this(context, attrs, R.styleable.TestTheme_testStyle); 
} 

public myButton(final Context context, final AttributeSet attrs, final int defStyle) { 
    super(context, attrs, defStyle); 

    final TypedArray array = context.obtainStyledAttributes(
      attrs, 
      R.styleable.TestButton, 
      defStyle, 
      R.style.testDefault); 
     final String s = array.getString(R.styleable.TestButton_testAttr); 
     setText(s); 
     array.recycle(); 
} 

,當然我設置清單中的主題:

<uses-sdk 
    android:minSdkVersion="7" 
    android:targetSdkVersion="15" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme" > 

    <activity 
     android:name=".TestActivity" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 


</application> 

它總是回落到由於某種原因,默認風格,不落的Android屬性。所以我在這裏錯過了什麼?

+0

我我在做類似的事情! http://stackoverflow.com/questions/17103894/overriding-referenced-style-attributes – toobsco42

回答

13

嗯,我應該問問題之前更好看......

找到了解決辦法:

更換此:

public myButton(final Context context, final AttributeSet attrs) { 
    this(context, attrs, R.styleable.TestTheme_testStyle); 
} 

與此:

public myButton(final Context context, final AttributeSet attrs) { 
    this(context, attrs, R.attr.testStyle); 
}