1

我正在为自定义视图而苦苦挣扎defStyleAttr。(简短说明我使用的是一个Preference示例,因为它与 Google 使用它的方式相同)

因此,对于 Android 提供的几乎每一个ViewPreference你都会有一个这样的构造函数

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

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

如果您现在查看定义,您会发现:

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

到现在一切都清楚了。但是这个属性以某种方式链接到一个主题

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

然后最终将样式与所需的布局资源 id 链接起来,该布局资源 id 将被移交给要膨胀的超类:

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

不幸的是,我无法找到有关主题如何PreferenceThemeOverlay链接到属性的提示seekBarPreferenceStyle

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

4

1 回答 1

2

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

自定义视图

对于我SeekBarPreference用作自定义对象的示例(Preference并且View非常相似)

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

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

主题

样式.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">

样式属性

一些.xml

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

仿生人的方式

但我想确切地知道它是如何连接的,然后在没有styleXML 文件中的任何属性或Android 提供的SeekBarPreference其他对象的情况下工作。PreferenceView

所以(通过 Android Studio)我跟随Theme.AppCompat.Light.DarkActionBar它的父级Theme.Holo.Light,看看我在那里找到了什么:

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

链接到链接布局资源的此样式:

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

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

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

于 2019-04-12T12:08:37.460 回答