ตัวเลือกสีพื้นหลังของ 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ในกรณีที่น่าสนใจ

เมื่อฉันกำหนดตัวเลือกนี้ให้TextViewเป็นandroid:background="@color/selector"ฉันได้รับข้อยกเว้นต่อไปที่รันไทม์:

ข้อผิดพลาด / AndroidRuntime (13130): เกิดจาก: org.xmlpull.v1.XmlPullParserException: ไฟล์ Binary XML บรรทัด # 6: แท็กต้องการแอตทริบิวต์ "drawable" หรือแท็กลูกที่กำหนด drawable

เมื่อฉันเปลี่ยนแอตทริบิวต์เป็น drawable มันใช้งานได้ แต่ผลลัพธ์ดูผิดไปหมดเพราะดูเหมือนว่า ID จะถูกตีความเป็นการอ้างอิงรูปภาพแทนการอ้างอิงสี (ตามที่ "drawable" แนะนำ)

สิ่งที่ทำให้ฉันสับสนคือฉันสามารถตั้งค่าการอ้างอิงสีเช่น "@ color / black" เป็นแอตทริบิวต์พื้นหลังได้โดยตรง สิ่งนี้ทำงานได้ตามที่คาดไว้ การใช้ตัวเลือกไม่ทำงาน

ฉันยังสามารถใช้ตัวเลือกเป็นตัวเลือกได้textColorโดยไม่มีปัญหา

วิธีใดที่ถูกต้องในการใช้ตัวเลือกสีพื้นหลังTextViewใน Android


สีสามารถตีความได้ว่าเป็นสีที่วาดได้ ผลลัพธ์มันผิดตรงไหน?
Romain Guy

มันไม่ได้แสดงสี แต่เป็นภาพจากแหล่งข้อมูลที่วาดได้ของฉันเป็นพื้นหลังแทน
Digitalbreed

2
ข้างต้นควรใช้งานได้หากคุณใช้ android: drawable ไม่ใช่ android: color - อย่างน้อยก็ในกรณีนั้นมันก็ใช้ได้สำหรับฉัน: android: drawable = "@ color / my_custom_color" สีของฉันถูกกำหนดในค่า / 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
ขอบคุณ Benoit ปัญหาได้รับการแก้ไขแล้ว (ต้องยอมรับว่าฉันจำไม่ได้ว่าสุดท้ายแล้วทำอย่างไร) และโครงการก็เสร็จสมบูรณ์ ขอขอบคุณที่คุณกลับมาที่นี่เพื่อโพสต์และช่วยให้ผู้คนแก้ไขปัญหาเดียวกันในอนาคตด้วยจิตวิญญาณที่ดี
digitalbreed

ฉันไม่สามารถทำงานนี้ได้ ฉันพยายามใช้มันกับปุ่มและมันตั้งพื้นหลังเป็นสีเริ่มต้นของตัวเลือก แต่มันไม่เปลี่ยนเป็นรูปร่างที่กำหนดใน state_pressed ฉันจะขาดอะไรไป ฉันอาจจะเปิดคำถามใหม่เผื่อว่าคุณจะชี้ทางที่ถูกต้องได้
Maragues

@ Maragues ยากที่จะบอกได้โดยไม่ต้องเห็นรหัสใด ๆ เราขอแนะนำให้คุณเปิดคำถามใหม่และโพสต์รหัสที่เกี่ยวข้องเพื่อให้เราทราบว่ามีอะไรผิดพลาด คุณสามารถเพิ่มความคิดเห็นในโพสต์นี้พร้อมกับลิงก์ไปยังโพสต์ใหม่ของคุณได้เช่นกัน
Benoit Martin

9
ทำไมไม่ใช้ "drawable =" @ color / your_color "โดยตรงในรายการตัวเลือกของคุณแทนคุณไม่จำเป็นต้องกำหนดรูปทรงหรือไฟล์อื่น ๆ แต่อย่างใดเพียงแค่กำหนดสีของคุณในค่า / colors.xml (มันดีเสมอ ไม่ใช่สีฮาร์ดโค้ด)
javaxian

ไม่ทำงาน. มันแสดงให้ฉันเห็นสีที่แตกต่างจากทั้งสองที่ฉันได้ประกาศไว้ในรูปร่าง xml
Er.Rohit Sharma

122

โซลูชันของ Benoit ใช้งานได้จริง แต่คุณไม่จำเป็นต้องเสียค่าใช้จ่ายในการวาดรูปร่าง เนื่องจากสีสามารถวาดได้เพียงกำหนดสีในไฟล์ /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>

ด้วยเหตุผลบางประการโซลูชันของคุณไม่แสดงสี แต่เป็นภาพสุ่มจากโฟลเดอร์ทรัพยากรที่วาดได้ของฉัน ฉันพยายามทำความสะอาดโปรเจ็กต์ / แก้ไขคุณสมบัติ / กู้คืน / เปิดคราสใหม่เพราะมันดูแปลกจริงๆ แต่ก็ไม่มีประโยชน์ แปลก.
Yahel

@ Yahel คุณอาจตั้งชื่อทรัพยากรที่สามารถวาดสีได้เหมือนกับไฟล์ที่วาดได้จริงหรือไม่?
Jona

@ โจน่า: ไม่ แต่สิ่งที่วาดได้นั้นมีชื่อว่า background_application และสีที่วาดได้นั้นมีชื่อว่า background_white_transparent ทั้งสองมีภูมิหลังอยู่ในนั้น ... ฉันเห็นในเธรดอื่นสิ่งเดียวกันนี้เกิดขึ้นกับคนอื่น ๆ ดังนั้นฉันจึงยื่นสิ่งนั้นเป็นหนึ่งในข้อบกพร่องของ Android จำนวนมากและปรับปรุงรูปแบบทั้งหมดของฉันเพื่อแก้ไขปัญหา
Yahel

@Yahel อืม ... ฉันเห็นปัญหานั้น แต่ในกรณีของฉันไม่ใช่ชื่อไฟล์เดียวกัน ... ชำระคำถามของฉันที่นี่stackoverflow.com/questions/9004744/…
โจน่า

ไม่สามารถทำให้มันใช้งานได้คำตอบจาก Benoit Martin ใช้งานได้ดี
Emmanuel Touzery

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

@ แบล็คเฮกแปลก ๆ . ใช้งานได้ดีสำหรับฉันใน Eclipse อาจเป็นข้อผิดพลาดของ Lint และหากเป็นเช่นนั้นคุณควรจะปิดใช้งานหรือเพิกเฉยได้
Jason Robinson

6
นี่คือสิ่งที่ฉันจะพิจารณาวิธีแก้ปัญหา
Lay González

<item android:state_pressed="true" android:color="@color/vantablack"/>มีความหมายเหมือนกันกับ<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis

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เป็นหนึ่งในคุณลักษณะของ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>

แอตทริบิวต์สีใช้งานได้เมื่อคุณตั้งค่าสี textview แต่ไม่ใช่กับพื้นหลังเนื่องจากสีบนพื้นหลังจะทำหน้าที่เป็น 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.