样式中的布局属性

Layout Attributes within Styles

一段时间以来,我一直处于困境中,不知道如何妥善解决。我想使用 DRY(不要重复自己),但不要在样式中应用不良做法(例如在其中设置布局属性)。

这是我的情况...

要在我的项目中封装文本样式,我通常使用以下方法:

我有一种风格叫做Wrap_Content

<style name="WrapContent">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

一方面,我有一个名为 Tv 的样式,它继承自 WrapContent:

<style name="Tv" parent="WrapContent">
    <item name="android:fontFamily">@font/font_foo</item>
    <item name="android:textColor">@color/color_foo</item>
</style>

如您所见,除此之外,Tv 样式具有默认字体和文本颜色 例如,如果我想使用 15sp 的字体大小,我应用这种样式:

<style name="Tv.15">
    <item name="android:textSize">15sp</item>
</style>

等等...

好吧,问题是我的项目的所有 TextView 都设置了 wrap_content 宽度和高度。 因此,这样做可以大大简化布局 XML 并提高可读性和分组常见行为。

示例:

<TextView
    style="@style/Tv.15"
    android:text="@string/foo"/>

如果在任何情况下,我想更改任何属性,我只需从我调用它的地方覆盖它。

问题是我将 textAppearance 样式与 layout 样式混合在一起。我考虑过将它分开......但我还没有解决主要问题,我正在为它设置布局属性,我应该只知道它自己的视图,而不是它的容器。

但是完全不能说服我的是做这样的事情:

<style name="Tv">
    <item name="android:fontFamily">@font/font_foo</item>
    <item name="android:textColor">@color/color_foo</item>
</style>

<style name="Tv.15">
    <item name="android:textSize">15sp</item>
</style>

<TextView
    style="@style/Tv.15"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/foo"/>

如果这些很常见,我不想用相同的属性重复一百万次。或者是的,我看到它带来了什么...... 技术债务。因此,它似乎不是一个有效的选项。

我搜索了很多,事实是我没有找到任何让我信服的东西,我想达到一些优雅的东西,因为它是我一直使用的东西,我不喜欢它.

嗯... 你觉得怎么样?

非常感谢!!!


已编辑 2019-11-08

我想到了一种添加新样式层的新方法,@style/TextAppearance。是这样的:

<style name="WrapContent">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

<style name="TextAppearance">
    <item name="android:fontFamily">@font/font_foo</item>
    <item name="android:textColor">@color/color_foo</item>
</style>

<style name="TextAppearance.15">
    <item name="android:textSize">15sp</item>
</style>

<style name="Tv" parent="WrapContent">
    <item name="android:textAppearance">@style/TextAppearance</item>
</style>

<style name="Tv.15">
    <item name="android:textAppearance">@style/TextAppearance.15</item>
</style>

这给系统增加了一点复杂性,但它拆分了布局和 textAppearance 属性。此外,它允许对按钮、editTexts 等使用 TextAppearance 样式。

在我们最近的 Android 开发者峰会上,我的两位同事就如何使用 Theme & Style 发表了演讲。我们建议您对视图组及其子项使用主题,对更简单的视图使用样式。也许您的布局需求可以通过使用主题来满足,然后为文本外观等保留样式。除此之外,功效应该指导您如何构建样式对象。