Как я могу каскадировать стиль по теме в Android - PullRequest
1 голос
/ 23 июня 2011

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

Вот концепция.

Допустим, мое приложение связано со спортом ... у приложения по умолчанию есть их "SportTheme". Я хотел бы, чтобы пользователитакже сказать, что они хотят тему «Футбол» или «Бейсбол», а для обозначенных элементов <TextView> мне бы хотелось, чтобы текст (по умолчанию «Спорт») изменился на «Футбол» или «Бейсбол», учитывая общую тему.применяется к activity?

в strings.xml

<string name="label_sport">Sport</string>
<string name="label_football">Football</string>
<string name="label_baseball">Baseball</string>

в activityA.java. Здесь важно то, что тема задана для действия (или приложение в порядке,тоже).

@Override
protected void onCreate(Bundle savedInstanceState)
{
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.layout_a);

    switch (user.ThemePreference)
    {
        case FOOTBALL_THEME:
            this.setTheme(R.style.FootballTheme);
            break;
        case BASEBALL_THEME:
            this.setTheme(R.style.BaseballTheme);
            break;
        default:
            this.setTheme(R.style.SportTheme);
            break;
    }
}

в layout_a.xml

...
<TextView
   android:id="@+id/tvSport"
   android:layout_height="wrap_content"
   android:layout_width="match_parent"
   android:text="@string/label_sport"
   android:style="@style/SportLabel"></TextView>

Что мне делать в темах / стилях?Что-то вроде этого?Здесь важен текст в TextView.Я буду использовать один и тот же textView в нескольких различных действиях в приложении.

<theme name="SportTheme" parent="android:Theme" />

<theme name="FootballTheme" parent="SportTheme">
   <item name="android:background">@color/brown</item>
</theme>

<theme name="BaseballTheme" parent="SportTheme">
   <item name="android:background">@color/green</item>
</theme>


<theme name="SportTheme.SportLabel">
   <item name="android:text">@string/label_sport</item>
</theme>

<theme name="FootballTheme.SportLabel">
   <item name="android:text">@string/label_football</item>
   <item name="android:textColor">@color/black</item>
</theme>


<theme name="BaseBallTheme.SportLabel">
   <item name="android:text">@string/label_baseball</item>
   <item name="android:textColor">@color/white</item>
</theme>

Спасибо за любую информацию, которую вы можете предоставить

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Чтобы настроить пользовательский интерфейс с темами, вам нужно определить атрибуты, которые вы хотите настроить внутри своих тем, и использовать ссылки на эти атрибуты в макетах (например, attr/backgroundColor).

В источниках Android есть три файлакоторые используются для этой цели: attrs.xml , styles.xml и themes.xml .Если вам нужны некоторые пользовательские атрибуты для настройки, вы должны объявить их в attrs.xml .Если вы собираетесь использовать только предопределенные атрибуты Android, вам не нужно создавать этот файл.

<declare-styleable name="SportTheme">
    <attr name="customAttribute" format="color" />
    <attr name="sportLabelStyle" format="reference" />
</declare-styleable>

Файл styles.xml используется для определения наборов значений атрибутов,Например, вы можете определить разные наборы стилей для каждого виджета.

<style name="Widget.TextView.SportLabel" parent="@android:style/Widget.TextView">
    <item name="android:textColor">@android:color/white</item>
    <item name="android:textSize">20sp</item>
</style>

themes.xml - основной файл, используемый для настройки.Все темы обычно определяются в этом файле.Вы можете настроить что-то несколькими способами.Например, вы можете определить значение по умолчанию в теме и ссылаться на него из макета.Также вы можете определить ссылку на стиль.

<style name="Theme.FootballTheme" parent="@android:style/Theme">
    <!-- define value for predefined Android attribute -->
    <item name="android:colorBackground">@android:color/white</item>
    <!-- define value for custom attribute -->
    <item name="customAttribute">@android:color/black</item>
    <!-- define reference to a style -->
    <item name="sportLabelStyle">@style/Widget.TextView.SportLabel</item>
</style>

layout.xml

<TextView
    android:background="?android:attr/colorBackground"
    android:textColor="?attr/customAttribute"
    style="?attr/sportLabelStyle" />

Обратите внимание, что стиль используется без пространства имен android.Это не опечатка.

Поэтому, если вы хотите настроить макет, используя темы, вы можете создать несколько тем и определить значения по умолчанию для атрибутов и наборов атрибутов (стилей) и ссылаться на эти значения, используя

?[android:]attr/attributeName

Звучит сложно, но это не совсем так.Вы можете использовать ресурсы Android в качестве примера стиля.

Пожалуйста, задайте свой вопрос, если что-то не понятно.

0 голосов
/ 23 июня 2011

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

...