1

AppThemeに余分な属性を複数回適用すると、前回の属性を上書きします。getTheme()。前のものを上書きせずに複数回applyStyle(...)

MainActivity:

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 

    getTheme().applyStyle(R.style.AppTheme_OverlayPrimaryRed); 

    // If you change `false` to `true`, the overlay above is overwritten. 
    if (false) { 
     getTheme().applyStyle(R.style.AppTheme_OverlayAccentRed); 
    } 

    super.onCreate(savedInstanceState); 

    ... 
} 

AppTheme.OverlayPrimaryRed:

<style name="AppTheme.OverlayPrimaryRed"> 
    <item name="colorPrimary">@color/material_red_500</item> 
    <item name="colorPrimaryDark">@color/material_red_700</item> 
</style> 

AppTheme.OverlayAccentRed:これは私が使用していたコードである

<style name="AppTheme.OverlayAccentRed"> 
    <item name="colorAccent">@color/material_red_A200</item> 
</style> 

どのように私はこの問題を解決することができます任意のアイデア?

答えて

2

あなたのスタイル定義AppTheme.OverlayPrimaryRedAppTheme.OverlayAccentRedは、AppThemeから暗黙に継承されています。 AppThemeにはおそらくcolorPrimarycolorPrimaryDarkの定義も含まれているので、2番目のapplyStyleステートメントはこれらの属性も設定して、最初のapplyStyle呼び出しを元に戻します。

この理由から、私はthis questionへの私の答えでスタイルオーバーレイ名にドットを使用しませんでした。

あなたがそうのようなオーバーレイのための空の親スタイルを定義することができる審美的な理由のためにドットを維持したい場合:

<style name="Overlay"> 
</style> 

<style name="Overlay.PrimaryRed"> 
    <item name="colorPrimary">@color/material_red_500</item> 
    <item name="colorPrimaryDark">@color/material_red_700</item> 
</style> 

<style name="Overlay.AccentRed"> 
    <item name="colorAccent">@color/material_red_A200</item> 
</style> 
+0

ありがとう!これは私のために働いた。 –

1

編集2:これは失敗した試行で、スタイルを適用すると、プログラミングによって設定された以前のスタイルが再び削除されます。

Androidのすべてのスタイルに親スタイルを設定できます。したがって、子スタイルは親のスタイルを継承し、独自のスタイルも適用します。また、子はその親のスタイルやプロパティをオーバーライドできます。

<!-- This is a parent style --> 
<style name="AppTheme.OverlayPrimaryRed"> 
    <item name="colorPrimary">@color/material_red_500</item> 
    <item name="colorPrimaryDark">@color/material_red_700</item> 
</style> 

<!-- This is a child of above style --> 
<style name="AppTheme.OverlayAccentRed" parent="AppTheme.OverlayPrimaryRed"> 
    <item name="colorAccent">@color/material_red_A200</item> 
</style> 

Defining StylesをAndroidデベロッパーのリソースで参照してください。また、parent属性を使用したくない場合は、

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

<style name="MyTextStyle"> 
    <item name="android:textAllCaps">false</item> 
    <item name="android:textColor">#FFFFFF</item> <!-- white text (default) --> 
    <item name="android:textStyle">bold</item> 
    <item name="android:textSize">12dp</item> 
</style> 

<!-- red text --> 
<style name="MyTextStyle.RED"> 
    <item name="android:textColor">#FF0000</item> 
</style> 

<!-- green text --> 
<style name="MyTextStyle.GREEN"> 
    <item name="android:textColor">#00FF00</item> 
</style> 

<!-- blue text --> 
<style name="MyTextStyle.BLUE"> 
    <item name="android:textColor">#0000FF</item> 
</style> 

お知らせ:たとえば、定義されたMyTextStyleスタイルを継承する新しいスタイルを作成しますが、色は赤にするために、あなたは、このような新しいスタイルを作成できますname属性がMyTextStyleスタイル名(作成したスタイル)で始まるため、このスタイルはそのスタイルからすべてのスタイルプロパティを継承します。このスタイルは、android:textColorプロパティをオーバーライドして、テキストを赤にすることができます。この新しいスタイルは@style/MyTextStyle.REDとして参照できます。

名前をピリオドで連結して、何度でも継承することができます。たとえば、あなたが、より大きくすることMyTextStyle.REDを拡張することができます

<style name="MyTextStyle.RED.Big"> 
    <item name="android:textSize">30sp</item> 
</style> 

を編集1:

<!-- this is your root style --> 
<style name="AppTheme.Overlay"> 
    <!-- default styles for primary, primaryDark (you can add accent too) --> 
</style> 

<!-- 1. add Custom Primary Color to root style --> 
<style name="AppTheme.Overlay.PrimaryRed"> 
    <item name="colorPrimary">@color/material_red_500</item> 
    <item name="colorPrimaryDark">@color/material_red_700</item> 
</style> 

<!-- 1. add Custom Accent Color to root style -->  
<style name="AppTheme.Overlay.AccentRed"> 
    <item name="colorAccent">@color/material_red_A200</item> 
</style> 

<!-- 2. add Custom Primary Color to root style --> 
<style name="AppTheme.Overlay.PrimaryBlue"> 
    <item name="colorPrimary">@color/material_blue_500</item> 
    <item name="colorPrimaryDark">@color/material_blue_700</item> 
</style> 

<!-- 2. add Custom Accent Color to root style -->  
<style name="AppTheme.Overlay.AccentBlue"> 
    <item name="colorAccent">@color/material_blue_A200</item> 
</style> 

<!-- add 10 for each...... --> 

あなたの原色のための10個のスタイル、そしてあなたのアクセント色のための10個のスタイルを作成します。

次に、あなたのコードで:

ここ
// if root style has some styles to add (default) 
getTheme().applyStyle(R.style.AppTheme_Overlay); 

// first color selection 
getTheme().applyStyle(R.style.AppTheme_Overlay_PrimaryRed); 
getTheme().applyStyle(R.style.AppTheme_Overlay_AccentRed); 

// when you want blue color 
getTheme().applyStyle(R.style.AppTheme_Overlay_PrimaryBlue); 
getTheme().applyStyle(R.style.AppTheme_Overlay_AccentBlue); 

// when you want bluePrimary, but redAccent color (bad choice) 
getTheme().applyStyle(R.style.AppTheme_Overlay_PrimaryBlue); 
getTheme().applyStyle(R.style.AppTheme_Overlay_AccentRed); 

AppTheme_Overlay_PrimaryBlueは​​を上書きします。等々。

ルートスタイルを1つ追加し、10個の主要なカラースタイルと10個のアクセントカラースタイル= 21スタイルを追加しました。

+0

はあなたの詳細な回答をいただき、ありがとうございます。私のアプリでは、「一次(暗い)色」と「アクセントの色」を変更するオプションが必要です。 10色の場合、これは10 + 10 = 20の可能なオーバーレイテーマです。あなたの方法は、10 * 10 = 100の可能なオーバーレイテーマを持っています。これはstyles.xmlに入れるのが大変です。あなたはこれを理解していますか、私がより詳細に説明してほしいですか? –

+0

私はちょうどあなたに返信する前にこれを学んだ。私の編集を確認してください。それでもあなたの質問に答えられない場合は、[私たちはこの部屋での議論を続けましょう](http://chat.stackoverflow.com/rooms/133704/)、どこに行方がないのか教えてください。 – rupinderjeet

関連する問題