Мобильная разработка

Как установить цвет текста TextView программно в Android

Пошаговое руководство по программной установке цвета текста TextView в Android. Использование Color, ContextCompat.getColor() и других методов.

4 ответа 1 просмотр

Как установить цвет текста TextView программно в Android?

В XML мы можем установить цвет текста с помощью атрибута textColor, например android:textColor=“#FF0000”. Но как изменить цвет текста программно в коде?

Я попробовал использовать:

java
holder.text.setTextColor(R.color.Red);

где holder - это класс, а text - это объект типа TextView. Red - это значение RGB (#FF0000), определенное в strings.xml.

Однако отображается другой цвет вместо красного. Какой тип параметра следует передать в метод setTextColor()? В документации указано, что это int, но является ли это ссылкой на ресурс или чем-то другим?

Чтобы установить цвет текста TextView программно в Android, используйте методы класса Color или ContextCompat.getColor() вместо прямого указания R.color.Red. Метод setTextColor() ожидает значение цвета в формате 0xAARRGGBB, а не идентификатор ресурса.


Содержание


Основные способы установки цвета текста TextView программно в Android

В Android существует несколько способов программной установки цвета текста для TextView. Самый распространенный подход - использование метода setTextColor(), который принимает целочисленное значение цвета в формате ARGB (Alpha, Red, Green, Blue).

Ключевое понимание здесь заключается в том, что Android работает с цветовыми значениями, а не с идентификаторами ресурсов. Когда вы определяете цвет в XML-файле, как <color name="Red">#FF0000</color>, система создает идентификатор ресурса R.color.Red, но для установки цвета вам нужно получить фактическое значение этого цвета, а не его идентификатор.

Существуют три основных подхода к программной установке цвета текста:

  • Использование предопределенных констант из класса Color
  • Парсинг цветовых строк с помощью Color.parseColor()
  • Извлечение цветов из ресурсов с помощью ContextCompat.getColor()

Почему holder.text.setTextColor(R.color.Red) не работает?

Проблема вашего подхода заключается в фундаментальном понимании того, как Android обрабатывает ресурсы. Когда вы используете R.color.Red, вы получаете идентификатор ресурса (целое число), который указывает на определение цвета, но не содержит самого значения цвета.

Представьте, что R.color.Red - это адрес книги в библиотеке, а не сама книга. Чтобы прочитать книгу, вам нужно сначала найти ее по адресу. В Android для этого есть специальные методы.

Также важно учитывать, что на разных версиях Android методы для получения цветов из ресурсов различаются:

  • На Android 6.0 (API 23) и выше можно использовать getColor()
  • На более старых версиях этот метод устарел
  • Для совместимости всех версий следует использовать ContextCompat.getColor()

Поэтому ваш код holder.text.setTextColor(R.color.Red); не работает, потому что вы передаете адрес вместо значения цвета. Система не знает, как интерпретировать этот идентификатор как цветовое значение.


Использование предопределенных цветов из класса Color

Android предоставляет предопределенные константы в классе Color, которые можно использовать для быстрой установки основных цветов. Это самый простой способ, когда вам нужны стандартные цвета.

Вот как использовать предопределенные цвета:

java
// Использование предопределенных цветов
holder.text.setTextColor(Color.RED); // Красный цвет
holder.text.setTextColor(Color.GREEN); // Зеленый цвет
holder.text.setTextColor(Color.BLUE); // Синий цвет
holder.text.setTextColor(Color.BLACK); // Черный цвет
holder.text.setTextColor(Color.WHITE); // Белый цвет
holder.text.setTextColor(Color.GRAY); // Серый цвет
holder.text.setTextColor(Color.YELLOW); // Желтый цвет

Для более сложных сценариев можно создавать произвольные цвета с помощью статических методов класса Color:

java
// Создание цвета через RGB значения (0-255)
int redColor = Color.rgb(255, 0, 0); // Красный
int greenColor = Color.rgb(0, 255, 0); // Зеленый
int blueColor = Color.rgb(0, 0, 255); // Синий

// Создание цвета через ARGB значения (0-255)
int colorWithAlpha = Color.argb(128, 255, 0, 0); // Полупрозрачный красный

Преимущество этого подхода в том, что он не требует дополнительных ресурсов и работает на всех версиях Android без проблем. Однако ограничение заключается в том, что вы не можете использовать цвета, определенные в ваших ресурсах XML, без дополнительных шагов.


Работа с цветами из ресурсов XML

Когда вам нужно использовать цвета, определенные в ваших ресурсах XML (например, в файле res/values/colors.xml), правильным подходом является использование ContextCompat.getColor(). Этот метод обеспечивает совместимость со всеми версиями Android.

Сначала определим цвет в ресурсах:

xml
<!-- res/values/colors.xml -->
<resources>
 <color name="primary_color">#6200EE</color>
 <color name="secondary_color">#03DAC5</color>
 <color name="error_color">#B00020</color>
 <color name="text_color">#000000</color>
</resources>

Теперь используем эти цвета в коде:

java
// Правильный способ получить цвет из ресурсов
Context context = holder.itemView.getContext();
int primaryColor = ContextCompat.getColor(context, R.color.primary_color);
int secondaryColor = ContextCompat.getColor(context, R.color.secondary_color);

// Применение цвета к TextView
holder.text.setTextColor(primaryColor);
holder.text.setTextColor(secondaryColor);

Обратите внимание, что ContextCompat.getColor() требует контекста для доступа к ресурсам. В адаптерах RecyclerView контекст можно получить из ViewHolder через holder.itemView.getContext().

Для цветовых строк можно также использовать парсинг:

java
// Парсинг цветовой строки
String colorString = "#FF0000"; // Красный цвет
int colorFromHex = Color.parseColor(colorString);

// Применение
holder.text.setTextColor(colorFromHex);

Этот подход особенно полезен, когда вы работаете с динамическими цветами, которые определяются во время выполнения, или когда вам нужно использовать цвета из XML-ресурсов.


Примеры кода для установки цвета текста TextView

Давайте рассмотрим практические примеры из реальных сценариев использования, чтобы лучше понять, как применять эти методы на практике.

Пример 1: Адаптер RecyclerView

java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
 private List<Item> items;
 private Context context;

 public static class ViewHolder extends RecyclerView.ViewHolder {
 public TextView text;

 public ViewHolder(View itemView) {
 super(itemView);
 text = itemView.findViewById(R.id.item_text);
 }
 }

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {
 Item item = items.get(position);
 
 // Установка текста
 holder.text.setText(item.getTitle());
 
 // Установка цвета текста разными способами
 if (item.isImportant()) {
 // Использование предопределенного цвета
 holder.text.setTextColor(Color.RED);
 } else {
 // Использование цвета из ресурсов
 int color = ContextCompat.getColor(context, R.color.text_color);
 holder.text.setTextColor(color);
 }
 }
}

Пример 2: Динамическое изменение цвета

java
// В активности или фрагменте
TextView myTextView = findViewById(R.id.my_text_view);

// Изменение цвета в зависимости от состояния
if (someCondition) {
 // Красный цвет с альфа-каналом
 int redColor = Color.argb(255, 255, 0, 0);
 myTextView.setTextColor(redColor);
} else {
 // Зеленый цвет через RGB
 int greenColor = Color.rgb(0, 255, 0);
 myTextView.setTextColor(greenColor);
}

// Использование парсинга цветовой строки
String hexColor = "#FFA500"; // Оранжевый
int orangeColor = Color.parseColor(hexColor);
myTextView.setTextColor(orangeColor);

Пример 3: Работа с темами

java
// Получение цвета из текущей темы
int textColorPrimary = ContextCompat.getColor(this, 
 android.R.attr.textColorPrimary);
int textColorSecondary = ContextCompat.getColor(this, 
 android.R.attr.textColorSecondary);

myTextView.setTextColor(textColorPrimary);

Пример 4: Создание цветовых ресурсов программно

java
// Создание цветовых ресурсов программно
Resources resources = getResources();
ColorStateList colorStateList = new ColorStateList(
 new int[][] {
 new int[] {android.R.attr.state_pressed},
 new int[] {android.R.attr.state_focused},
 new int[] {}
 },
 new int[] {
 Color.RED, // Цвет при нажатии
 Color.BLUE, // Цвет при фокусе
 Color.BLACK // Цвет по умолчанию
 }
);

// Применение к TextView
holder.text.setTextColor(colorStateList);

Эти примеры показывают различные сценарии использования программной установки цвета текста, от простых случаев до более сложных, таких как работа с темами и динамическими цветовыми состояниями.


Советы и лучшие практики для работы с цветами в Android

При работе с цветами в Android разработке существуют несколько важных рекомендаций, которые помогут вам создавать более качественный и поддерживаемый код.

1. Используйте ресурсы цветов

Всегда определяйте цвета в ресурсах XML (res/values/colors.xml), а не используйте магические числа в коде. Это делает код более читаемым и позволяет легко изменять цветовые схемы.

xml
<!-- res/values/colors.xml -->
<resources>
 <color name="primary_color">#6200EE</color>
 <color name="secondary_color">#03DAC5</color>
 <color name="background_color">#FFFFFF</color>
 <color name="text_color">#000000</color>
</resources>

2. Обеспечивайте поддержку темной темы

Современные приложения должны поддерживать темную тему. Определяйте цветовые ресурсы для светлой и темной темы:

xml
<!-- res/values/colors.xml -->
<resources>
 <color name="primary_color">#6200EE</color>
 <color name="primary_dark_color">#3700B3</color>
 <color name="background_color">#FFFFFF</color>
 <color name="text_color">#000000</color>
</resources>

<!-- res/values-night/colors.xml -->
<resources>
 <color name="primary_color">#BB86FC</color>
 <color name="primary_dark_color">#3700B3</color>
 <color name="background_color">#121212</color>
 <color name="text_color">#FFFFFF</color>
</resources>

3. Используйте ContextCompat.getColor() для совместимости

Всегда используйте ContextCompat.getColor() вместо устаревших методов для получения цветов из ресурсов:

java
// Правильно - работает на всех версиях Android
int color = ContextCompat.getColor(context, R.color.primary_color);

// Неправильно - может не работать на старых версиях
int color = context.getResources().getColor(R.color.primary_color);

4. Используйте ColorStateList для интерактивных элементов

Для кнопок, переключателей и других интерактивных элементов используйте ColorStateList для определения разных цветов в разных состояниях:

xml
<!-- res/color/button_text_color.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_pressed="true" android:color="#FFFFFF"/>
 <item android:state_focused="true" android:color="#CCCCCC"/>
 <item android:color="#000000"/>
</selector>
java
// Применение ColorStateList
ColorStateList colorStateList = ContextCompat.getColorStateList(context, R.color.button_text_color);
myButton.setTextColor(colorStateList);

5. Оптимизируйте производительность

При частом изменении цветов избегайте создания новых объектов Color в циклах. Кэшируйте цветовые значения:

java
// Хорошо - кэширование цветов
private static final int COLOR_RED = Color.RED;
private static final int COLOR_GREEN = Color.GREEN;

// В цикле
holder.text.setTextColor(COLOR_RED);

// Плохо - создание новых объектов в цикле
holder.text.setTextColor(new Color()); // Не делайте так

6. Используйте Material Design цвета

Для согласованности с Material Design используйте предопределенные цвета из библиотеки Material Components:

java
// Material Design цвета
holder.text.setTextColor(Color.parseColor("#6200EE")); // Material Purple 600
holder.text.setTextColor(Color.parseColor("#03DAC5")); // Material Teal 400

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


Источники

  1. Stack Overflow — Ответы о программной установке цвета текста в Android: https://stackoverflow.com/questions/4602902/how-to-set-the-text-color-of-textview-in-code

  2. Android Developers — Официальная документация по TextView и методу setTextColor: https://developer.android.com/reference/android/widget/TextView

  3. Metanit — Руководство по работе с цветами в Android приложениях: https://metanit.com/java/android/2.7.php


Заключение

Установка цвета текста TextView программно в Android требует понимания разницы между идентификаторами ресурсов и фактическими цветовыми значениями. Основная проблема вашего подхода holder.text.setTextColor(R.color.Red) заключается в том, что вы передаете идентификатор ресурса вместо значения цвета.

Правильные способы установки цвета текста включают:

  • Использование предопределенных констант из класса Color (Color.RED, Color.GREEN и т.д.)
  • Создание цветов через Color.rgb() и Color.argb()
  • Парсинг цветовых строк с помощью Color.parseColor()
  • Извлечение цветов из ресурсов с помощью ContextCompat.getColor()

Для максимальной совместимости и лучшей практики всегда используйте ContextCompat.getColor() при работе с цветами из ресурсов XML и определяйте все цвета в ресурсах, а не в коде. Это сделает ваше приложение более поддерживаемым и готовым к будущим изменениям цветовой схемы.

Nanne / Ответственный разработчик

Для установки цвета текста TextView программно в Android нужно использовать:

java
holder.text.setTextColor(Color.RED);

Вместо передачи идентификатора ресурса (R.color.Red), который представляет собой ссылку, а не фактическое значение цвета, следует использовать различные методы класса Color:

  • Color.parseColor("#FFFFFF") - для парсинга hex-строк
  • Color.rgb(200,0,0) - для задания RGB значений
  • Color.argb(0,200,0,0) - для задания ARGB значений с альфа-каналом

Если вы определили цвет в XML файле как <color name="errorColor">#f00</color>, используйте ContextCompat.getColor(context, R.color.your_color) вместо устаревшего getColor(). Также можно использовать прямые hex-значения: myTextView.setTextColor(0xAARRGGBB).

G

Метод setTextColor() TextView принимает целое число, представляющее цветовое значение в формате 0xAARRGGBB, где:

  • AA - альфа-канал (прозрачность)
  • RR - красная компонента
  • GG - зеленая компонента
  • BB - синяя компонента

Не передавайте идентификатор ресурса напрямую. Для получения значения цвета из ресурса используйте ContextCompat.getColor(). Это обеспечит правильную работу на всех версиях Android, включая те, где устаревшие методы были удалены.

M

В Android цвета определяются в файле res/values/colors.xml:

xml
<resources>
 <color name="purple_200">#FFBB86FC</color>
 <color name="purple_500">#FF6200EE</color>
 <color name="black">#FF000000</color>
 <color name="white">#FFFFFFFF</color>
</resources>

Для задания цветовых ресурсов можно использовать форматы #RGB, #ARGB, #RRGGBB, #AARRGGBB. Чтобы получить цвет из ресурсов применяется метод resources.getColor(), но для минимальной версии Android не ниже 6.0 (API 23). Для совместимости с более старыми версиями используйте ContextCompat.getColor(context, R.color.your_color).

Авторы
Nanne / Ответственный разработчик
Ответственный разработчик
G
Команда разработчиков Android
M
Образовательная команда
Проверено модерацией
Модерация