样式中的布局属性

时间:2019-10-31 17:39:12

标签: android android-layout android-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"/>

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

我已经搜索了很多东西,事实是我还没有找到任何可以说服我的东西,并且我想获得一种优雅的东西,因为它是我一直使用的东西,我不喜欢它。 / p>

好吧... 您怎么看?

非常感谢您!


已编辑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属性。此外,它允许将TextAppearance样式用于按钮,editTexts等。

1 个答案:

答案 0 :(得分:1)

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