我正在尝试在android上创建一个自定义复合 View (从relativelayout继承而来),并试图指定默认样式。我可以完成此操作,但是我想知道defStyleAttr参数的用途以及如何使用它。
我遇到了这个方法context.obtainStyledAttributes(AttributeSet集,int [] attrs,int defStyleAttr,int defStyleRes)。
我明白那个:
AttributeSet set
我将从 View 的构造函数中获取从XML膨胀,
int[] attrs
将是任何我可能已创建的自定义 View 字段
int defStyleRes
将是我可以提供的默认样式,它定义为一种样式
资源。
但是,我不知道如何使用
int defStyleAttr
参数。我已经阅读了文档,并提供了如下attr资源:<declare-styleable name="BMTheme">
<attr name="BMButtonStyle" format="reference" />
</declare-styleable>
然后在我的主题资源文件中有这个:
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="BMButtonStyle">@style/BMButton</item>
</style>
依次引用此样式:
<style name="BMButton">
<item name="text">some string</item>
<item name="android:paddingLeft">10dp</item>
<item name="android:paddingRight">10dp</item>
</style>
在代码中,当我为
defStyleAttr
传递0和为defStyleRes
传递样式资源ID时,我成功获取了我在BMButton样式中定义的默认值:TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RightArrowButton, 0, R.style.BMButton);
但是,当我为
defStyleAttr
传递BMButtonStyle(反过来引用BMButton样式)的attr资源ID时,为defStyleRes
传递0时,则无法获得我在样式中指定的值。TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RightArrowButton, R.attr.BMButtonStyle, 0);
请让我知道我是否以错误的方式使用了
defStyleAttr
参数,并且如果有人知道,为什么似乎仅defStyleAttr
就足够了,为什么同时需要defStyleRes
和defStyleRes
参数呢? 最佳答案
阅读这篇文章后,我找出了哪里出了问题:
Creating default style with custom attributes
基本上,为了使用defStyleAttr
参数,我的项目需要在 list 中设置我的自定义主题定义的主题。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Custom" >