Подтвердить что ты не робот

Как установить другую тему в макет

Я установил тему по умолчанию для всего приложения. Он определен в styles.xml следующим образом:

    <style name="DefaultTheme" parent="@android:style/Theme.Holo.Light">
        <!-- Customization here -->
    </style>

Я также определил темную тему:

    <style name="DarkTheme" parent="@android:style/Theme.Holo">
        <!-- Customization here -->
    </style>

В манифесте объявлена ​​легкая тема в качестве основной темы для приложения:

    <application
    ...
    android:theme="@style/DefaultTheme" >

Теперь это работает нормально, но в действии мне нужно задать другую тему для одного макета. Что-то вроде этого:

    +--------------------------------------------------+
    |         Parent Linear layout (default theme)     |
    |                                                  |
    | +------------------------------------+ +-------+ |
    | |                                    | |       | |
    | |     Left linear layout             | |       | |
    | |     (default theme)                | |       | |
    | |                                    | |       | |
    | |                                    | |       | |
    | |                                    | |    ·<----------- Right Linear Layout
    | |                                    | |       | |        (Need it in dark theme)
    | |                                    | |       | |
    | |                                    | |       | |
    | +------------------------------------+ +-------+ |
    +--------------------------------------------------+

В макете xml файла я пытаюсь установить тему для самого правого ребенка LinearLayout:

    <LinearLayout
    style="@style/DarkTheme">
    ...

Я ожидаю, что это будет работать отлично, и применить темную тему только к правильному макету (и его дочерние представления), но он не работает. Я попытался заменить @style на встроенный стиль @android: безрезультатно. Я тестировал это в редакторе макетов и на реальном устройстве/симуляторе.

Можно ли применить специальную тему или стиль к одному макету?

4b9b3361

Ответ 1

Теперь это возможно, используя свойство android:theme в представлении и настроив его на любую понравившуюся вам тему. Обратите внимание, что дочерние представления наследуют тему своего родителя.

Ответ 2

Вы можете использовать ContextThemeWrapper() для применения темы при создании макета программным ContextThemeWrapper().

LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));

Ответ 3

В библиотеке поддержки вы можете:

app:theme="R.style.MyTheme"

Ответ 4

API 24 добавляет параметр темы для каждого просмотра, но требует Зефир или выше.
Альтернативой является использование библиотеки поддержки Android для максимальной совместимости.

Установите параметр темы библиотеки поддержки для представления

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    ...
>
    <LinearLayout
        app:theme="R.style.MyTheme"
        ...
    >
        <!-- content-->
    </LinearLayout>
...
</LinearLayout>

который ссылается на тему, определенную как стиль внутри ресурса XML

<resources>
    <style name="MyTheme">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>