自定义视图和 defStyleAttr
Custom views and defStyleAttr
我正在努力处理自定义视图 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 将移交给超级 class 进行扩充:
<style name="Preference.SeekBarPreference.Material">
<item name="android:layout">@layout/preference_widget_seekbar_material</item>
<!-- ... -->
</style>
遗憾的是,我无法找到有关主题 PreferenceThemeOverlay
如何链接到属性 seekBarPreferenceStyle
的提示。
那么这两者是如何联系起来的呢?
我终于找到了 answer 解释了您需要了解的基础知识。
自定义视图
对于示例,我使用 SeekBarPreference
作为自定义对象(Preference
和 View
非常相似)
简而言之,有两种方法可以设置您的默认样式。
为您的 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
或其他)。
因此,如果您对此有任何线索,请随时添加到评论中:)
我正在努力处理自定义视图 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 将移交给超级 class 进行扩充:
<style name="Preference.SeekBarPreference.Material">
<item name="android:layout">@layout/preference_widget_seekbar_material</item>
<!-- ... -->
</style>
遗憾的是,我无法找到有关主题 PreferenceThemeOverlay
如何链接到属性 seekBarPreferenceStyle
的提示。
那么这两者是如何联系起来的呢?
我终于找到了 answer 解释了您需要了解的基础知识。
自定义视图
对于示例,我使用 SeekBarPreference
作为自定义对象(Preference
和 View
非常相似)
简而言之,有两种方法可以设置您的默认样式。
为您的 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
或其他)。
因此,如果您对此有任何线索,请随时添加到评论中:)