2

私はいくつかの異なるアプリを持っていますActivities。さまざまなアクティビティには、さまざまなスタイルのボタン、テキストなどがあります。場所/アクティビティに基づいてさまざまなスタイルを持つように、すべてのコンポーネントを設定しました。(例: style="@style/MainMenuActionBarTitle、またはstyle="@style/MainMenuActionBarTagLine)。これらのスタイルはbackground( DrawableMipMap、またはColor)、textColorなどを設定します...

アプリは、アプリケーション全体でこれらのさまざまなコンポーネントの色を変更するいくつかのテーマ パックを提供する予定です。同じ名前で、アプリの設定Stylesに基づいて異なる値を持つ方法があることを望んでいました。Themeこのようにして、ユーザーが選択したテーマに が読み込まThemeれるたびにを変更できます。Activity

テーマを使用して標準のウィジェットのルック アンド フィールを変更する方法については、ここにいくつかの良い情報がありますが、それは標準の非スタイル ウィジェットのルック アンド フィールを変更します。

テーマを使用してこれを達成する方法はありますか、またはこれは完全に間違った方向ですか? より良い/より簡単なルートはありますか?

編集:より多くの調査とより多くの操作を行った後、私がやりたいことは、これを達成する方法とそう遠くないことに気付きました。私がしたいのは、 の を設定するときに実際にコンポーネントを変更することStylesです。ThemeActivity

4

1 に答える 1

1

私が発見した解決策の 1 つは、 which が別の を指すことができる を使用attributesするThemeことStylesです。

attrs.xml

<resources>
   <!-- Attributes referencing whatever style the theme needs to set up. -->
   <attr name="main_menu_button_style_play" format="reference" />
</resources>

themes.xml

<resources>
   <!-- Base application theme. -->
   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <!-- App specific attributes -->
       <item name="@attr/main_menu_button_style_play">@style/MainMenu.Button.Play</item>
   </style>

   <!-- Blue application theme. -->
   <style name="AppTheme.Blue" parent="AppTheme">
      <!-- App specific attributes -->
      <item name="@attr/main_menu_button_style_play">@style/MainMenu.Button.Play.Blue</item>
   </style>
</resources>

スタイル.xml

<style name="MainMenu.Button.Play">
    <item name="android:background">#f76d3c</item>
    <item name="android:text">PLAY</item>
</style>

<style name="MainMenu.Button.Play.Blue">
    <item name="android:background">#2ca8c2</item>
</style>

活動.xml

<Button android:id="@+id/main_play_button"
        style="?attr/main_menu_button_style_play"/>

これは非常にうまく機能Themeし、Activity.onCreate()メソッドに を設定できます。

このソリューションで私が抱えている唯一の厄介な問題は、 Android Studioが に定義されているにもかかわらず、Buttonが欠落していると不平を言うことです。選択した を介して属性参照をたどらないと思います。layout_widthlayout_heightStyleTheme

私が最終的に使用した別のアプローチは、属性をより頻繁に使用することでした。テーマ間で変更したいすべてのプロパティ値の属性を作成します。main_menu_button_style_playそのため、スタイル リファレンスを定義する代わりに、 を使用しmain_menu_button_play_backgroundました。テーマは継承できるため、このアプローチは単にスタイルを指定するのと同じ量の作業ですが、IDE はそれを理解します。

于 2015-06-30T20:48:54.950 に答える