web-dev-qa-db-ja.com

アプリでデバイスのデフォルトテーマを使用する方法

Android 2.1、2.2、2.3.3、3.0/3.1、および4.0.x向けに開発したいアプリがあります。これらのAPIレベルの間には、約3種類のテーマがあります。最新の4.0.xテーマはHoloです。

とにかく、どのデバイスでもデフォルトのAndroidテーマを使用します。4.0.xデバイスの場合はHoloを使用します。2.3.3の場合はIそのバージョンのAndroidなどのテーマを使用したい...

これにアプローチする簡単な方法はありますか? 4.0では、Theme.DeviceDefault使用できるテーマですが、これは古いAPIレベルでは役に立ちません。これに対する最善のアプローチは何ですか?

41
Jake Wilson

現在、Androidデバイス(.Lightバリエーションなどは含まれていません)で使用できるテーマが最大3つあります。

Theme

Theme

Android 2.3 Gingerbread(10)までの初期バージョンのデフォルト。これらのバージョンのいくつかのマイナーなスタイル変更を含む


Theme.Holo

Theme.Holo

Android 3.0 Honeycomb(11)で導入


Theme.Material

Theme.Material

Android 5.0 Lollipop(21)の新機能


Theme.DeviceDefault

(何でもいい)

4.0アイスクリームサンドイッチ(14)が導入されました。このテーマは、デバイスメーカーがカスタマイズできます。これは、デバイスのネイティブな外観を表します。つまり、NexusデバイスのHoloまたはMaterial(&Android Studioのデザインエディター)、他のデバイスではカスタムなものかもしれません。オプションとして、これらのデバイスにはストックテーマが付属している必要がありますが、ストックテーマが必要なアプリはそれを指定する必要があります。


これに対する最善のアプローチは何ですか?

テーマなし+ targetSdkVersion> = 14

最も単純ですが、必ずしも最適ではないオプションは、テーマをまったく定義しないことです。 Androidはデフォルトを選択します。ただし、Androidは、予期しないテーマでアプリを驚かせたくないので、テーマに戻りますあなたはおそらくあなたのアプリを設計していたでしょう。それはAndroid:targetSdkVersion内のAndroidManifest.xml(今日ではgradleを介して設定できます)を見ることによってそうします。

  • Theme(つまり、APIレベル3〜10)しかなかった古いプラットフォームをターゲットとするアプリは、Themeのみを取得します。
  • 11〜13を対象とするアプリはTheme.Holoを取得します。
  • 14以上はTheme.DeviceDefaultを取得します。

これは単に後方互換性のためであるため、古いGingerbread電話ではTheme.Materialを取得できません。したがって、テーマなし+ターゲット14+ =デバイスのデフォルト。

さまざまなテーマを指定する

Androidのリソースオーバーレイシステムでは、デバイスAPIレベルに基づいてスタイルを指定できます。たとえば、res/values-v11res/values-v21のスタイルの異なるバージョン。これは、Android Studioが自動的にセットアップするアプリを介して新しく作成されたアプリでもあります。

例として、.Lightテーマアプリの最も基本的なセットアップは次のようになります。

/res/values/styles.xmlはすべてのデバイスに適用され、ベースとして機能します

<resources>
    <style name="AppTheme" parent="Android:Theme.Light"/>
</resources>

/res/values-v11/styles.xmlは、APIレベル11以上(21以上のデバイスを含む)を持つすべてのデバイスにロードされます。ただし、実際には「AppTheme」の最新バージョンのみが使用されます。

<resources>
    <style name="AppTheme" parent="Android:Theme.Holo.Light"/>
</resources>

/res/values-v21/styles.xml

<resources>
    <style name="AppTheme" parent="Android:Theme.Material.Light"/>
</resources>

注:代わりにTheme.DeviceDefault/res/values-v14/styles.xmlに指定するだけで、デフォルトの外観を得るのに十分ですが、デザインを微調整することはできません。 v14オーバーライドを追加しても害はありません。結局、DeviceDefaultとHoloは異なる可能性があります。


AndroidManifest.xmlは、カスタムテーマを使用する場所です。例えば。アプリケーション全体のデフォルトとして:

...
<application
    Android:theme="@style/AppTheme"
    ...

公式ドキュメントへのリンク

プラットフォームのバージョンに基づいてテーマを選択 -リソース設定を介して異なるスタイルを定義するための公式ドキュメント

Holo Everywhere -デフォルトのメカニズムとDeviceDefault/Holoテーマを説明するブログ投稿

マテリアルテーマの使用 -マテリアルドキュメント

68
zapl

Values/styles.xmlでテーマを宣言し、values-v11/styles.xmlでテーマをHoloバージョンでオーバーライドできます。

values/styles.xml:

 <style name="DialogTheme" parent="@Android:style/Theme.Dialog"></style>

values-v11/styles.xml:

 <style name="DialogTheme" parent="@Android:style/Theme.Holo.Light.Dialog.NoActionBar"></style>

そうすれば、API 11以降のデバイスにはHoloテーマがあり、他のデバイスには通常のテーマがあります。

よろしくステファン・ヴァンスガード

3