我正在努力与自定义视图defStyleAttr
。 (简短说明我使用Preference
作为例子,因为它与谷歌使用它的方式相同)
所以几乎每个由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
的提示。
那么这两者如何联系起来呢?
我终于找到了一个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">
some.xml
<SeekBarPreference
[...]
style="@style/LINK_TO_DEFINING_STYLE"
[...] />
但我想确切地知道所有这些都是如何连接到没有任何style
属性的XML文件中的SeekBarPreference
或Android提供的其他Preference
和View
对象。
所以(通过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主题联系起来。
所以,如果您对此有任何线索,请随时添加评论:)