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.Light
はTheme.Holo
とTheme.Light
から継承しているようです。
それはどのように機能しますか、または私は何を正しく読んでいませんか?
私もこれについて疑問に思っていたので、簡単なテストアプリを作成して試してみました。リソースファイルは次のようになります。
_<!--
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でテストされました。