自定义视图和defStyleAttr

时间:2019-04-11 15:23:43

标签: android xml android-custom-view declare-styleable

我正在为自定义视图defStyleAttr苦苦挣扎。 (请注意,我使用的是Preference作为示例,因为它与Google使用的方式相同)

因此,对于Android提供的几乎每个ViewPreference,您都会拥有一个类似this的构造函数:

public SeekBarPreference(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.seekBarPreferenceStyle);
}

这将默认样式属性定义为R.attr.seekBarPreferenceStyle

如果您现在查看definition,您会发现:

<attr name="seekBarPreferenceStyle" format="reference" />

直到现在一切都变得清晰。但是此属性以某种方式链接到theme

<resources>
    <style name="PreferenceThemeOverlay">
        <!-- ... -->
        <item name="seekBarPreferenceStyle">@style/Preference.SeekBarPreference.Material</item>
        <!-- ... -->
    </style>
    <!-- ... -->
</resources>

然后最终将style与所需的布局资源ID链接在一起,该ID将移交给要膨胀的超类:

<style name="Preference.SeekBarPreference.Material">
        <item name="android:layout">@layout/preference_widget_seekbar_material</item>
        <!-- ... -->
</style>

不幸的是,我找不到关于主题PreferenceThemeOverlay如何与属性seekBarPreferenceStyle链接的提示。

那么这两个如何链接?

1 个答案:

答案 0 :(得分:0)

我终于找到了answer,它解释了您需要了解的基本知识。

自定义视图

对于示例,我使用SeekBarPreference作为自定义对象(PreferenceView非常相似)

简而言之,有两种方法可以设置默认样式。

要么为您的活动(或类似活动)设置自定义主题,以将某些内容链接到您的自定义样式(seekBarPreferenceStyle),要么直接通过style XML属性设置样式。

主题

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="seekBarPreferenceStyle">@style/LINK_TO_DEFINING_STYLE</item>
</style>

AndroidManifest.xml

<activity android:name=".SomeActivity" android:theme="@style/AppTheme">

样式属性

some.xml

<SeekBarPreference
[...]
style="@style/LINK_TO_DEFINING_STYLE"
[...] />

Android方式

但是我想确切地了解它的所有连接方式,然后在提供style或其他SeekBarPreferencePreference对象的XML文件中没有任何View属性的情况下工作通过Android。

因此(通过Android Studio),我跟随Theme.AppCompat.Light.DarkActionBar到其父项Theme.Holo.Light,并查看了在其中找到的内容:

<!-- ... -->
<item name="seekBarPreferenceStyle">@style/Preference.Holo.SeekBarPreference</item>
<!-- ... -->

链接到用于链接布局资源的this样式:

<style name="Preference.Holo.SeekBarPreference">
    <item name="layout">@layout/preference_widget_seekbar</item>
</style>

为了再次给您带来更多的困惑,Android似乎将问题中的Material样式而不是答案中的Holo主题链接到默认主题(无论是DeviceDefault还是其他东西)。

因此,如果您对此有任何了解,请随时添加评论:)