自定义视图和defStyleAttr

问题描述 投票:0回答:1

我正在努力与自定义视图defStyleAttr。 (简短说明我使用Preference作为例子,因为它与谷歌使用它的方式相同)

所以几乎每个由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的提示。

那么这两者如何联系起来呢?

android xml android-custom-view declare-styleable
1个回答
0
投票

我终于找到了一个answer,它解释了你需要知道的基础知识。

Custom View

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

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

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

Theme

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">

Style attribute

some.xml

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

Androids Way

但我想确切地知道所有这些都是如何连接到没有任何style属性的XML文件中的SeekBarPreference或Android提供的其他PreferenceView对象。

所以(通过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似乎将问题的材质风格与默认主题(无论是DeviceDefault还是别的东西)的答案中的Holo主题联系起来。

所以,如果您对此有任何线索,请随时添加评论:)

© www.soinside.com 2019 - 2024. All rights reserved.