8

私は Android 開発の初心者であり、コーディングは完全に理にかなっていますが、Android テーマは私見ではありません

この単純なタスクの実装に問題があります。

私は(たとえば)「何とか」という名前の色を持っています

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="blah">#F0F0F0</color>
<resources>

これは、XML レイアウトまたはコードのあらゆる場所で、さまざまなビュー コンポーネントによって "@color/blah" として使用されます。

この色の値をテーマごとに変更したいだけです

したがって、MyTheme1 を使用する場合、何とか #F0F0F0 にする必要があり、MyTheme2 を使用する場合、何とか #00FF00 にする必要があります。

私のアプリは特別なスタイルなどを必要とせず、テーマごとの色だけであるため、テーマについて読んでいますが、この単純なタスクを実装する方法をまだ見つけることができません。

事前にサンクス

アップデート:

Mohamed_AbdAllah によって提供されたリンクの後、attrs.xml と styles.xml で定義することにより、いくつかのカスタム カラーを作成することに成功しました。

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="color_item_title" format="color|reference" />
</resources>

スタイル.xml

<style name="AppBaseThemeDark" parent="android:Theme.Black">
<item name="color_item_title">@color/White</item>                      
</style>

しかし今、もっと深刻な問題が発生しています

すべてのビューで色 ?color_item_title をうまく使用できるので、ボタンとテキストは実際にその色になります。

ただし、その ?color_item_title をカスタム ドローアブルまたはリストビュー レイアウト (ランタイム中にインフレートされるビュー) で使用すると、クラッシュが発生します。

したがって、リストビュー listitem レイアウト内で ?color_item_title を使用すると、実行時にその行にインフレータ メッセージが表示されてクラッシュします :(

また、ドローアブルでもクラッシュします:(インフレエラーが再び発生します)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<solid android:color="@color/Black" />
<corners
    android:bottomLeftRadius="8dp"
    android:bottomRightRadius="8dp"
    android:topLeftRadius="8dp"
    android:topRightRadius="8dp" />
 <stroke android:width="1dp" android:color="?color_item_title" />
</shape>
4

3 に答える 3

3

検索して試してみると、できることとできないことがあるというヒントが得られまし

あなたはできる

a) attrs で独自の属性を定義する

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="color_gallery_backround" format="color|reference" />
</resources>

b)styles.xmlで値を設定します

<style name="AppBaseThemeDark" parent="android:Theme.Black">
           <item name="color_gallery_backround">@color/White</item>              
 </style>
 <style name="AppBaseThemeWhite" parent="android:Theme.Light">
           <item name="color_gallery_backround">@color/Black</item>              
 </style>

c) ?color_gallery_backround または ?attr/color_gallery_backround などの任意のビューでそれらを使用します。

android:background="?attr/color_gallery_backround"

できません

a) インフレーション中は有効ではないため、カスタム ドローアブルからこの属性にアクセスすることはできません

したがって、ここで ?attr/color_gallery_backround を使用することはできません:

customshape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<solid android:color="**?attr/color_gallery_backround**" />
 <stroke android:width="2dp" android:color="@color/Black" />
</shape>

b) (たとえば) ListView を ListItem ビューとして実行中に膨張するビューでは、この属性にアクセスできません。

そのため、少なくとも API 10 までの属性のテーマ「サポート」には深さの制限があります。

ソリューション

示唆されているように、異なる色を使用して 2 つの別個のドローアブルを作成し、テーマに従ってこれらのドローアブルを参照するように属性を設定する必要があります。

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="rounded_background" format="reference" />   
</resources>

そして、各テーマで、styles.xml で実際に使用するドローアブルを設定します。

<resources>

    <style name="AppBaseThemeDark" parent="android:Theme.Black">
           <item name="rounded_background">@drawable/round_rect_shape_dark</item>    
           </style>

    <style name="AppBaseThemeLight" parent="android:Theme.Light">
           <item name="rounded_background">@drawable/round_rect_shape_white</item>     
           </style>

</resources>

これで、ドローアブルを ?rounded_background として参照し、テーマに選択させることができます。

ListView リストアイテム レイアウト内の膨張したビューの場合、プログラムで色を設定する必要があります。

于 2013-05-19T21:49:18.833 に答える
0

John Sが提案したように機能しますが、属性の定義では、「参照」だけでなく「色|参照」を追加する必要がありました。したがって、私の attrs.xml ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="rounded_background" format="color|reference" />   
    </resources>

よろしくお願いします!

于 2015-01-13T15:50:25.640 に答える
0

blah目的を達成する唯一の方法は、2 つの異なる色を定義することです。blah2たとえば、テーマでそれを参照します。

于 2013-05-19T10:49:03.977 に答える