Налаштування глобальних стилів для переглядів в Android


125

Скажімо, я хочу, щоб усі TextViewпримірники в моєму додатку були textColor="#ffffff". Чи є спосіб встановити це в одному місці замість того, щоб встановити його для кожного TextView?


1
Я оновив своє запитання, щоб воно стало більш повним.
Крістіан

Я щось подібне роблю ТУТ !!! 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(у цьому випадку, жирному та червоному)!

Це було протестовано на пристроях від рівня 4 API і, здається, працює чудово.


1
Найелегантніше рішення, яке я бачив досі.
Italo Borssatto

@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>

Чи будете ви використовувати той чи інший вибір, залежить від ваших потреб. Якщо єдине, що ви хочете зробити, - це змінити зовнішній вигляд, то найкращим підходом є перший. З іншого боку, якщо ви хочете змінити зовнішній вигляд і додати трохи нових функціональних можливостей у свої віджети, другий - це шлях.


слід віддати перевагу користувацьким класам, оскільки це більш чистий підхід та допомагає зберегти невелику вагу файлів 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 не працює.
пратт

3

Визначте стиль та використовуйте його на кожному віджеті, визначте тему, яка переосмислює стандартний для цього віджета андроїд, або визначте рядовий ресурс та посилайтесь на нього у кожному віджеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.