Атрибуты макета в стилях - PullRequest
0 голосов
/ 31 октября 2019

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

1 Ответ

1 голос
/ 07 ноября 2019

В нашем последнем Android Dev Summit двое моих коллег рассказали, как использовать Theme & Style . Мы рекомендуем использовать темы для групп просмотра, их дочерние элементы и стили для упрощения просмотра. Возможно, ваши макеты могут быть удовлетворены с помощью тем и затем зарезервировав стили для появления текста и тому подобное. Помимо этого, эффективность должна определять, как вы структурируете свои объекты стиля.

...