Проблема наследования при использовании свойства 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 самый сильный:

  1. style
  2. android:theme
  3. 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"
Другие вопросы по тегам