我遇到了一段时间的困境,我不知道如何正确解决它。我想使用 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等。
答案 0 :(得分:1)
在我们最近的Android Dev Summit上,我的两位同事发表了有关如何使用Theme & Style的演讲。我们建议您将“主题用于视图”组及其子级和样式用于更简单的视图。也许可以通过使用主题来满足您的布局需求,然后为文本外观等保留样式。除此之外,功效还应指导您如何构造样式对象。