我正在尝试在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就足够了,为什么同时需要defStyleResdefStyleRes参数呢?

    最佳答案

    阅读这篇文章后,我找出了哪里出了问题:
    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" >
    

    10-08 11:53