我正在为自定义视图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
链接的提示。
那么这两个如何链接?
答案 0 :(得分:0)
我终于找到了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
或其他SeekBarPreference
和Preference
对象的XML文件中没有任何View
属性的情况下工作通过Android。
因此(通过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
还是其他东西)。
因此,如果您对此有任何了解,请随时添加评论:)