所以这是我的问题:我创建了一个扩展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 :(得分: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);
}