Ответ 1
Теперь это возможно, используя свойство android:theme
в представлении и настроив его на любую понравившуюся вам тему. Обратите внимание, что дочерние представления наследуют тему своего родителя.
Я установил тему по умолчанию для всего приложения. Он определен в 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: безрезультатно. Я тестировал это в редакторе макетов и на реальном устройстве/симуляторе.
Можно ли применить специальную тему или стиль к одному макету?
Теперь это возможно, используя свойство android:theme
в представлении и настроив его на любую понравившуюся вам тему. Обратите внимание, что дочерние представления наследуют тему своего родителя.
Вы можете использовать ContextThemeWrapper()
для применения темы при создании макета программным ContextThemeWrapper()
.
LinearLayout darkThemeLayout = new LinearLayout(new ContextThemeWrapper(context, R.style.DarkTheme));
В библиотеке поддержки вы можете:
app:theme="R.style.MyTheme"
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>