11

アンドロイドtextColorPrimaryを背景色にしたスタイルを作りたいです。うまくいかない次のことを試しましたが、その結果、レイアウトがまったく表示されません。

<style name="horizontalLine">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">1dp</item>
    <item name="android:background">?android:attr/textColorPrimary</item>
</style>

スタイルの背景色として textColorPrimary を使用するにはどうすればよいですか?

4

4 に答える 4

7

属性を使用しようとすると、この構文はうまくいくようです:

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="?android:textColorPrimary"
        android:text="Hello"/>

(また)

<style name="MyStyle">
   <item name="android:textColor">?android:textColorPrimary</item>
</style>

アプリのテーマを Holo から Holo.Light に変更すると、テキストの色が自動的に変更されます。

ただし、ビューの背景として設定すると機能しません-Androidは、参照されているドローアブルがドローアブルを指定していない状態リストであると不平を言ってクラッシュします(色の状態リストです)。

    Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: <item> tag requires a 'drawable' attribute or child tag defining a drawable
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:178)
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:885)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
    at android.content.res.Resources.loadDrawable(Resources.java:1950)
    ... 39 more

リソースを直接参照できるHoloEverywhereを使用していますが、ネイティブの場合も同様の問題が発生するはずです。状態リスト xml のコンポーネントとして使用されるプライマリ、非選択、非アクティブ (など) の色は、属性を介して公開されているとは思いません。

いずれにせよ、使用されるテキストの色は、アプリ開発者が選択するテーマによって異なります。Holo (暗い) テーマの使用を選択した場合、テキストは明るい色になり、ユーザーはこれに影響を与えることができなくなります。アプリの線の色を動的にする必要はありません。

于 2013-08-03T06:35:59.087 に答える
2

これに対して表示されるエラーメッセージは次のとおりです。

org.xmlpull.v1.XmlPullParserException: Binary XML file line #18: <item> tag requires a 'drawable' attribute or child tag defining a drawable

少し調べてみると、仕様では、background属性が色または描画可能なリソースへの参照をサポートする必要があると書かれています。

...参照しているリソースを見るStateListDrawable.

platforms/android-17/data/res/color/primary_text_dark.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="@android:color/bright_foreground_dark_disabled"/>
    <item android:state_window_focused="false" android:color="@android:color/bright_foreground_dark"/>
    <item android:state_pressed="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:state_selected="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:state_activated="true" android:color="@android:color/bright_foreground_dark_inverse"/>
    <item android:color="@android:color/bright_foreground_dark"/> <!-- not selected -->
</selector>

ただし、 StateListDrawable のドキュメントでは、要素drawableに対して属性を定義する必要があることも明示的に述べています。item

https://developer.android.com/guide/topics/resources/drawable-resource.html

<item>
    Defines a drawable to use during certain states, as described by its attributes. Must be a child of a <selector> element.

    attributes:

    android:drawable
        Drawable resource. Required. Reference to a drawable resource.

... の場合には当てはまりませんprimary_text_dark.xml。したがって、参照しているドローアブルが仕様に準拠していないように見えるため、機能していません。

primary_text_dark回避策は、デフォルトの状態で使用されている色を参照することだと思います: bright_foreground_dark。それは公開されていないので、それが参照しているものに直接アクセスする必要があります。

android:background="@android:color/background_light"
于 2013-08-03T22:54:22.357 に答える