web-dev-qa-db-ja.com

Android 2つの親テーマから継承するXMLテーマ?

Androidのスタイルとテーマはいつも頭を回転させているようです。アプリのAndroid)のさまざまなバージョンでHolo UIを使用したかったので、ソースを参照して必要なリソースを抽出することにしました。

Android-15\data\res\values\themes.xmlで次のことに遭遇しましたが、正確に何が「継承」されているのか、どこから来ているのかについて混乱しています。

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

Android APIガイド は言う:

自分で定義したスタイルから継承する場合は、parent属性を使用する必要はありません。代わりに、継承するスタイルの名前の前に、ピリオドで区切って新しいスタイルの名前を付けるだけです。

しかし、上記のコードから、Theme.Holo.LightTheme.HoloTheme.Lightから継承しているようです。

それはどのように機能しますか、または私は何を正しく読んでいませんか?

39
Gautam

私もこれについて疑問に思っていたので、簡単なテストアプリを作成して試してみました。リソースファイルは次のようになります。

_<!--
    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のライトバージョン」として説明する名前が必要だったからです。そして、彼らは$ @&!ingを混乱させたかったからです。

これはジンジャーブレッド2.3.3でテストされました。

69
Shitesh