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

Тема Android XML, наследующая от двух родительских тем?

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

Я встретил следующее в android-15\data\res\values\themes.xml, и я смущен относительно того, что именно является "унаследованным" и откуда:

<style name="Theme.Holo.Light" parent="Theme.Light">
    ...
    ...
</style>

В руководстве API Android говорится:

Если вы хотите наследовать стили, которые вы сами определили, вы не нужно использовать атрибут parent. Вместо этого просто префикс имени стиля, который вы хотите унаследовать от имени вашего нового стиля, разделенных периодом.

Но из приведенного выше кода кажется, что Theme.Holo.Light наследует от Theme.Holo и от Theme.Light.

Как это работает, или что я не читаю правильно?

4b9b3361

Ответ 1

Мне тоже интересно об этом, поэтому я написал простое тестовое приложение, чтобы попробовать. Файл ресурсов выглядит следующим образом:

<!--
    Base application theme, dependent on API level. This theme is replaced
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme">
    <!--
        Theme customizations available in newer API levels can go in
        res/values-vXX/styles.xml, while customizations related to
        backward-compatibility can go here.
    -->
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

<style name="AppTheme.TestTheme" parent="android:Theme.Light">

</style>

Поэтому я применяю AppTheme.TestTheme к активности в файле манифеста. AppTheme делает окно полноэкранным и не имеет заголовка. Theme.Light делает фона фона окна вместо темного по умолчанию. Когда указан атрибут parent="android:Theme.Light", это окно является белым, а не полноэкранным - это означает, что атрибут parent="..." имеет приоритет над префиксом имени, а иерархия выглядит как TestTheme <- Theme.Light (light) <- Theme (dark).

С отключенным parent = "android: Theme.Light" экран темный и полноэкранный, поэтому иерархия TestTheme <- AppTheme (fullscreen) <- AppBaseTheme <- Theme (dark) находится на месте.

Когда указано parent="...", при удалении префикса это не имеет значения. Таким образом, parent="...", похоже, определенно имеет приоритет. AppTheme.TestTheme не наследуется от обоих родителей сразу.

Теперь, смотря на файл themes.xml по умолчанию, кажется, что Theme.Holo.Light наследуется от Theme.Light, а затем все материалы Holo указаны вручную в его описании. Поэтому они назвали его Theme.Holo.Light не потому, что он наследует от Holo, а потому, что им нужно имя, которое описывает его как "легкую версию Holo". И потому, что они хотели запутаться в [email protected]&! Ing.

Это было протестировано на Gingerbread 2.3.3.