Проблема наследования при использовании свойства androidTextapperance или стиля свойства
У меня есть корневая тема и наследующая дочерняя тема:
<resources>
<color name="colorRed">#FF0000</color>
<color name="colorGreen">#00FF00</color>
<style name="Root" parent="Theme.AppCompat.Light.DarkActionBar" />
<style name="Root.TextAppearance" parent="android:TextAppearance">
<item name="android:textColor">@color/colorGreen</item>
</style>
<style name="Child" parent="Root">
<item name="android:textColor">@color/colorRed</item>
</style>
</resources>
В файле манифеста я установил тему Child
, В макете я применяю внешний вид текста из корневой темы:
<TextView
android:textAppearance="@style/Root.TextAppearance"
android:text="Hello World!"
- Ожидаемый: зеленый текст
- Актуальный: красный текст
Как работает Root.TextAppearance
унаследовать красный цвет?
3 ответа
Проверка порядка приоритетов
Краткий ответ на вопрос: темы имеют приоритет над android:textAppearance
,
Существуют разные типы иерархий для Android. При использовании styles
Атрибут иерархия стилей применяется, как и ожидалось. Предполагая, что styles
иерархия также применяется для android:textAppearance
Атрибут явно терпит неудачу.
Есть другая иерархия для тем. Эта иерархия следует вниз по дереву макета. Тема Child
применяется в манифесте и является верхним уровнем.
Кажется, настройки, входящие в эту тему верхнего уровня, даже отменяют настройки android:textAppearance
на более низком уровне. Это все еще кажется неправильным, поскольку более низкие уровни обычно должны перезаписывать более высокие уровни.
Поэтому я делаю несколько тестов, применяя атрибуты style
, android:theme
а также android:textAppearannce
выяснить порядок их сильных сторон.
Оказывается, что texAppearance
самый слабый и style
самый сильный:
style
android:theme
android:textAppearance
Я думаю, что это объяснение, почему theme
с более высокого уровня может переписать android:textAppearance
на нижнем уровне. Я признаю, что считаю низкий приоритет textAppearance
довольно запутанно. Я не ожидал, что это сработает. Тем не менее, вот результаты, которые я обнаружил, проверяя.
Вы должны установить стиль, а не textAppearance
style="@style/Root.TextAppearance"
также в стилях Root.TextAppearance должен иметь Root в качестве родителя
<style Root.TextAppearance parent="android:TextAppearance">
чем установить android:textAppearance="@style/Root.TextAppearance" и все должно работать
Внести некоторые изменения, поместите код цвета в color.xml
<color name="colorRed">#FF0000</color>
<color name="colorGreen">#00FF00</color>
тогда после попробуйте это..
android:textAppearance="@style/Root.TextAppearance"