自定义视图和 defStyleAttr

Custom views and defStyleAttr

我正在努力处理自定义视图 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 将移交给超级 class 进行扩充:

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

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

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

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

自定义视图

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

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

为您的 activity(或类似的)设置自定义主题,link 与您的自定义样式 (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"
[...] />

Androids 方式

但我想知道所有这些是如何连接到 SeekBarPreference 或其他 Preference 和 XML 文件中没有任何 style 属性的情况下工作的=17=] 对象由 Android.

提供

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

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

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

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

最后再次给您带来更多困惑,Android 似乎 link 问题中的 Material 风格,而不是默认答案中的 Holo 主题主题(可以是 DeviceDefault 或其他)。

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