У меня некоторое время была дилемма, что я не знаю, как ее решить правильно. Я хочу использовать 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. Кроме того, он позволяет использовать стиль TextAppearance
для кнопок, editTexts и т. Д.