Установка глобальных стилей для представлений в Android

125

Допустим, я хочу, чтобы все TextViewэкземпляры в моем приложении были textColor="#ffffff". Есть ли способ установить это в одном месте вместо того, чтобы устанавливать его для каждого TextView?

Эмануил Русев
источник
1
Я обновил свой вопрос, чтобы он стал более полным.
Cristian
Я делаю нечто подобное ЗДЕСЬ !!! stackoverflow.com/questions/17103894/…
toobsco42

Ответы:

250

Фактически, вы можете установить стиль по умолчанию для TextViews (и большинства других встроенных виджетов) без необходимости создавать собственный класс java или индивидуально настраивать стиль.

Если вы заглянете themes.xmlв исходный код Android, вы увидите множество атрибутов стиля по умолчанию для различных виджетов. Ключ - это textViewStyle(илиeditTextStyle атрибут и т. Д.), Который вы переопределяете в своей настраиваемой теме. Вы можете переопределить их следующим образом:

Создайте styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
</style>
</resources>

Затем просто примените эту тему к своему приложению в AndroidManifest.xml:

<application […] android:theme="@style/MyTheme">

И все ваши текстовые представления по умолчанию будут иметь стиль, определенный в MyTextViewStyle (в данном случае жирный и красный)!

Это было протестировано на устройствах, начиная с уровня API 4, и, похоже, отлично работает.

Стив Помрой
источник
1
Самое элегантное решение, которое я видел до сих пор.
Итало Борссатто, 02
@Steve, если я включу элемент <item name="android:textViewStyle">@style/MyTextViewStyle</item>в стиль MyTheme, а затем применю стиль к моему приложению, все мои TextViews будут отображаться в соответствии со стилем (даже имя приложения на панели действий). Как исправить проблему с панелью действий? Я хочу, чтобы у него был вид по умолчанию. Github
Максим Дмитриев
@Steve, Как применить обе темы (панель действий и виджет) к приложению
Pratik Butani
Я не уверен, как отличить ActionBar от других вещей. Возможно, вы сможете найти место, где установлен ваш стиль ActionBar, а затем поместить <item name="android:textViewStyle">@style/MyTextViewStyle</item>туда же, просто указав на ActionBar по умолчанию (или что-то подобное)
Стив Помрой
@StevePomeroy, это не работает для меня ... не могли бы вы оказать поддержку. Мой стиль для TextViews остается прежним. Есть ли минимум элементов, которые мне нужно установить, или есть элементы, которые мне не разрешено устанавливать?
Майк
52

Это можно сделать двумя способами:

1. Использование стилей

Вы можете определить свои собственные стили, создав XML-файлы в res/valuesкаталоге. Итак, предположим, вы хотите иметь красный и полужирный текст, затем вы создаете файл с этим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyRedTheme" parent="android:Theme.Light">
    <item name="android:textAppearance">@style/MyRedTextAppearance</item>
  </style>
  <style name="MyRedTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
  </style>
</resources>

Вы можете назвать его, например, как хотите res/values/red.xml. Тогда единственное, что вам нужно сделать, это использовать это представление в виджетах, которые вы хотите, например:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    style="@style/MyRedTheme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Для получения дополнительной информации вы можете прочитать эту статью: Общие сведения о темах и стилях Android.

2. Использование пользовательских классов

Это еще один возможный способ добиться этого, и это будет предоставить ваш собственный, TextViewкоторый всегда устанавливает цвет текста на любой желаемый ; например:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
public class RedTextView extends TextView{
    public RedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTextColor(Color.RED);
    }
}

Затем вам просто нужно рассматривать это как нормальное TextViewв вашем XML-файле:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.example.RedTextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Используете ли вы тот или иной выбор, зависит от ваших потребностей. Если единственное, что вы хотите сделать, это изменить внешний вид, тогда лучший подход - это первый. С другой стороны, если вы хотите изменить внешний вид и добавить некоторые новые функции к своим виджетам, вам подойдет второй вариант.

Cristian
источник
использование пользовательских классов должно быть предпочтительным, поскольку это более чистый подход и помогает сохранить легкий вес XML-файла.
Амит Кумар,
@AmitKumar Нет, не должны! В данном конкретном случае это означало бы использовать отдельный настраиваемый класс для каждого значения атрибута. Это создает большой объем кода и делает фактический макет более нечитаемым (вам придется посетить каждый класс, чтобы увидеть, что он делает, вместо того, чтобы просто читать несколько строк xml). Пользовательские классы следует использовать только в том случае, если вы изменяете поведение, но не, если единственным изменением является внешний вид представления.
Андре
Невозможно установить стиль пользовательского представления из xml? Почему мы не можем использовать его в custom_view_layout.xmlфайле, который используется для расширения настраиваемого класса?
lucidbrot
5

Для цвета текста по умолчанию в TextView, установленной android:textColorTertiaryв вашей теме в желаемый цвет:

<item name="android:textColorTertiary">@color/your_text_color</item>

Цветами многих других элементов управления Android можно управлять с помощью атрибутов платформы или атрибутов библиотеки поддержки, если вы используете библиотеку поддержки.

Для получения списка атрибутов , которые вы можете установить, проверить исходный код Android в styles.xmlи themes.xml, или это очень полезно сути Дэн Льет, попробуйте изменить значение каждое и посмотреть , что они меняют на экране.

Гидро
источник
Спасибо, мужик! Я потратил кучу времени, выясняя, почему textColorPrimary не работает.
pratt
3

Определите стиль и используйте его для каждого виджета, определите тему, которая переопределяет значение Android по умолчанию для этого виджета, или определите строковый ресурс и укажите на него ссылку в каждом виджете.

TWH
источник