【问题标题】:Custom views and defStyleAttr自定义视图和 defStyleAttr
【发布时间】:2019-04-11 15:23:43
【问题描述】:

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

因此,对于 Android 提供的几乎每个 View 或 Preference,您都会有一个类似 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】:

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

    自定义视图

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

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

    可以为您的活动(或类似内容)设置自定义主题,将某些内容链接到您的自定义样式 (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">
    

    样式属性

    一些.xml

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

    机器人之道

    但我想知道所有这些是如何连接的,然后在没有任何 SeekBarPreference 或 Android 提供的其他 Preference 和 View 对象的 XML 文件中的属性的情况下工作。

    所以(通过 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 还是其他)的答案联系起来。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多