TextViewの背景色のセレクター


121

TextViewユーザーがタッチしたときにAndroid ウィジェットの背景色を変更しようとしています。私はその目的のためにセレクターを作成しました。セレクターは、res/color/selector.xml次のように格納され、大体そのように見えます

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/semitransparent_white"
        />
    <item
        android:color="@color/transparent"
        />
</selector>

clickable属性がTextViewあるtrue興味のだ場合には、。

このセレクターをTextViewas に割り当てるとandroid:background="@color/selector"、実行時に次の例外が発生します。

エラー/ AndroidRuntime(13130):発生原因:org.xmlpull.v1.XmlPullParserException:バイナリXMLファイルの行#6:タグには「drawable」属性またはドローアブルを定義する子タグが必要です

属性を描画可能に変更すると機能しますが、IDは(「描画可能」が示唆するように)カラー参照ではなくイメージ参照として解釈されるため、結果は完全に間違って見えます。

私を混乱させるのは、背景属性として直接「@ color / black」などの色参照を設定できることです。これは期待どおりに機能しています。セレクターを使用しても機能しません。

セレクターもtextColor問題なく使用できます。

TextViewAndroidでbackground-color-selectorをに適用する正しい方法は何ですか?


色はドローアブルとして解釈できます。結果はどのように正確に間違っていますか?
Romain Guy、

色ではなく、描画可能なリソースの画像を背景として表示しています。
digitalbreed 2010

2
android:colorではなくandroid:drawableを使用している場合、上記は機能するはずです。少なくともその場合は、android:drawable = "@ color / my_custom_color"で機能します。私の色は、values / colors.xmlで定義されています
AgentKnopf

回答:


226

ここでの問題は、カラーセレクターを使用して背景色を定義できないことです。ドローアブルセレクターが必要です。したがって、必要な変更は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/selected_state" />
</selector>

また、そのリソースdrawable自体はカラーセレクターではないため、より意味のあるディレクトリにそのリソースを移動する必要があります。

次に、次のres/drawable/selected_state.xmlようなファイルを作成する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="@color/semitransparent_white" />
</shape>

最後に、次のように使用します。

android:background="@drawable/selector"

:OPが画像リソースを取得したのは、おそらくカラーディレクトリにあるリソースを参照しようとしたが、使用@drawableしてIDの衝突が発生し、間違ったリソースを選択したためと考えられます。

OPがおそらく今までに彼の問題をおそらく解決したとしても、これがまだ誰かを助けることを願っています。


1
ありがとう、ブノワ。問題は解決しました(認めざるを得ません。最後に正確にどのようにしたか思い出せません)。プロジェクトは無事に終了しました。ここに戻って投稿し、将来同じ問題に直面している人々を助けてくれたことに感謝します。
digitalbreed 2011年

私はこの仕事をすることができません。私はそれをボタンに適用しようとしています、それは背景をセレクターのデフォルトの色に設定しますが、state_pressedで定義された形に変わりません。何が欠けているのでしょうか?私が正しい方向に向けられるように、私は新しい質問を開くかもしれません。
Maragues

@Maraguesコードを見ずに見分けるのは難しいです。新しい問題を開いて関連するコードを投稿して、問題の原因を突き止めることをお勧めします。新しい投稿へのリンクを使用して、この投稿にコメントを追加することもできます。
ブノワマーティン

9
代わりに、セレクターアイテムで直接 "drawable =" @ color / your_color "を直接使用しないのはなぜですか?形状やその他のファイルを定義する必要はなく、values / colors.xmlに色の定義を含めるだけです(常に良いです)ハードコードしないでください)
javaxian

機能していません。その形のxmlで宣言した両方とは異なる色を示しています。
Er.Rohit Sharma

121

ブノワのソリューションは機能しますが、形状を描画するためにオーバーヘッドを負担する必要はありません。色はドローアブルにすることができるため、/ res / values / colors.xmlファイルで色を定義するだけです。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="semitransparent_white">#77ffffff</color>
</resources>

そして、セレクターでそのまま使用します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@color/semitransparent_white" />
</selector>

何らかの理由で、あなたのソリューションは色ではなく、私の描画可能なリソースフォルダーからのランダムな画像を表示しています。それは本当に奇妙に思われるので、プロジェクト/プロパティの修正/ Eclipseの再オープン/再オープンをクリーンアップしようとしましたが、役に立ちませんでした。変だ。
Yahel

@Yahelカラーのドローアブルリソースに実際のドローアブルファイルと同じ名前を付けた可能性がありますか?
ジョナ

@Jona:いいえ、ただし、ドローアブルはbackground_applicationという名前で、カラードローアブルはbackground_white_transparentという名前でした。どちらにも背景がありました...他のスレッドでも同じことが他のスレッドでも発生するので、Androidの多数のバグの1つとしてそれを報告し、レイアウト全体を修正して回避しました。
Yahel、2012

@Yahelうーん...まあ、私はここに私の質問はありません同じファイル名...チェックアウトその問題を参照してくださいが、私の場合はstackoverflow.com/questions/9004744/...
ジョナ

うまくいくことができませんでした、Benoit Martinからの答えはうまくいきました。
Emmanuel Touzery 2012

83

上記のさらに簡単な解決策:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/semitransparent_white" />
    </item>
    <item>
        <color android:color="@color/transparent" />
    </item>
</selector>

それをドローアブルフォルダーに保存すれば、準備は完了です。


1
多分これは動作しますが、公式にはサポートされていません(Android Studioはこれをエラーとして扱います)。
Blackhex 2013

@Blackhex Strange。私にとってはEclipseで問題なく動作します。これはおそらくLintエラーであり、もしそうであれば、それを無効にするか無視することができるはずです。
Jason Robinson

6
これが私が解決策と考えるものです。
LayGonzález2014年

<item android:state_pressed="true" android:color="@color/vantablack"/>意味的に同一に見える<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis '14 / 07/14

16

これでも機能します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:drawable="@android:color/white" />
</selector>

android:drawable各アイテムに属性を追加しました。値は色です。

ところで、なぜ彼らはそれcolorが属性の1つであると言うのselectorですか?彼らはそれandroid:drawableが必要であると書いていない。

色状態リストリソース

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

color属性は、テキストビューの色を設定しているときに機能しますが、背景は実際にはありません。背景の色はColorDrawableとして機能します
Akhil Dad

上記のすべてを実装するための最良かつ最も簡単なソリューション。
4gus71n

6

バックグラウンドセクターを作成せずにそれを行うために検索している人のために、それらの行を TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

それを選択可能な使用にするためにも:

android:textIsSelectable="true"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.