Bộ chọn trên màu nền của TextView


121

Tôi đang cố gắng thay đổi màu nền của TextViewtiện ích Android khi người dùng chạm vào nó. Tôi đã tạo một bộ chọn cho mục đích đó, được lưu trữ trong res/color/selector.xmlvà gần giống như sau:

<?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>

Các clickablethuộc tính của TextViewtrue, trong trường hợp đó là sự quan tâm.

Khi tôi gán bộ chọn này thành TextViewas android:background="@color/selector", tôi nhận được ngoại lệ sau trong thời gian chạy:

LỖI / AndroidRuntime (13130): Gây ra bởi: org.xmlpull.v1.XmlPullParserException: Dòng tệp XML nhị phân # 6: thẻ yêu cầu thuộc tính 'drawable' hoặc thẻ con xác định một drawable

Khi tôi thay đổi thuộc tính thành có thể vẽ, nó hoạt động, nhưng kết quả trông hoàn toàn sai vì các ID dường như được hiểu là tham chiếu hình ảnh thay vì tham chiếu màu (như "có thể vẽ" đề xuất).

Điều khiến tôi bối rối là tôi có thể đặt trực tiếp tham chiếu màu, ví dụ: "@ color / black", làm thuộc tính nền. Điều này đang hoạt động như mong đợi. Sử dụng bộ chọn không hoạt động.

Tôi cũng có thể sử dụng bộ chọn textColormà không có vấn đề gì.

Cách chính xác để áp dụng bộ chọn màu nền cho một TextViewtrong Android là gì?


Màu có thể được hiểu là có thể vẽ được. Kết quả sai chính xác như thế nào?
Romain Guy

Thay vào đó, nó không hiển thị màu sắc mà là một hình ảnh từ các nguồn có thể vẽ của tôi làm nền.
digitalbreed vào

2
Ở trên sẽ hoạt động, nếu bạn sử dụng android: drawable, không phải android: color - ít nhất trong trường hợp đó, nó hoạt động với tôi: android: drawable = "@ color / my_custom_color". Màu sắc của tôi được định nghĩa trong các giá trị / colors.xml
AgentKnopf

Câu trả lời:


226

Vấn đề ở đây là bạn không thể xác định màu nền bằng bộ chọn màu, bạn cần một bộ chọn có thể vẽ được . Vì vậy, những thay đổi cần thiết sẽ như sau:

<?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>

Bạn cũng cần phải di chuyển tài nguyên đó đến drawablethư mục mà nó sẽ có ý nghĩa hơn vì nó không phải là một bộ chọn màu.

Sau đó, bạn sẽ phải tạo res/drawable/selected_state.xmltệp như sau:

<?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>

và cuối cùng, bạn sẽ sử dụng nó như thế này:

android:background="@drawable/selector"

Lưu ý : lý do tại sao OP nhận được một tài nguyên hình ảnh được vẽ có thể là do anh ta đã cố gắng chỉ tham chiếu tài nguyên của mình vẫn còn trong thư mục màu nhưng sử dụng @drawablenên anh ta đã kết thúc với sự cố ID, chọn sai tài nguyên.

Hy vọng điều này vẫn có thể giúp ích cho ai đó ngay cả khi OP có lẽ đã giải quyết được vấn đề của anh ấy vào lúc này.


1
Cảm ơn, Benoit. Vấn đề đã được giải quyết (tôi phải thừa nhận rằng, tôi không thể nhớ chính xác cuối cùng tôi đã làm như thế nào) và dự án đã kết thúc thành công. Tôi đánh giá cao việc bạn đã quay lại đây để đăng bài và giúp đỡ những người có cùng vấn đề trong tương lai, thần linh tuyệt vời!
digitalbreed

Tôi không thể làm cho việc này thành công. Tôi đang cố gắng áp dụng nó cho một nút và nó đặt nền thành màu mặc định của bộ chọn, nhưng nó không thay đổi thành hình dạng được xác định trong state_pressed. Tôi có thể thiếu gì? Tôi có thể mở một câu hỏi mới, đề phòng bạn có thể chỉ cho tôi đúng hướng.
Maragues

@Maragues thật khó nhận biết nếu không nhìn thấy bất kỳ mã nào. Tôi khuyên bạn nên mở một câu hỏi mới và đăng mã liên quan để chúng tôi có thể tìm ra điều gì có thể sai. Bạn cũng có thể thêm nhận xét vào bài đăng này với liên kết đến bài đăng mới của bạn.
Benoit Martin

9
Thay vào đó, tại sao không chỉ cần sử dụng "drawable =" @ color / your_color "trực tiếp trong các mục bộ chọn của bạn? Bạn không cần phải xác định bất kỳ hình dạng hoặc bất kỳ tệp nào khác, chỉ cần có định nghĩa màu của bạn trong giá trị / color.xml (nó luôn tốt không để màu mã cứng).
javaxian

Không làm việc. Nó cho tôi thấy màu khác với cả hai màu mà tôi đã khai báo trong hình dạng xml's.
Er.Rohit Sharma

121

Giải pháp của Benoit hoạt động, nhưng bạn thực sự không cần phải tốn chi phí để vẽ một hình dạng. Vì màu có thể vẽ được nên chỉ cần xác định màu trong tệp /res/values/colors.xml:

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

Và sau đó sử dụng như vậy trong bộ chọn của bạn:

<?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>

Vì lý do nào đó, giải pháp của bạn không hiển thị màu mà là một hình ảnh ngẫu nhiên từ thư mục tài nguyên có thể vẽ của tôi. Tôi đã cố gắng làm sạch dự án / sửa chữa thuộc tính / lưu lại / mở lại nhật thực vì nó có vẻ thực sự kỳ lạ, nhưng vô ích. Kỳ dị.
Yahel

@Yahel Bạn có thể đặt tên tài nguyên có thể vẽ màu giống như một tệp có thể vẽ thực tế?
Jona

@Jona: Không, nhưng có thể vẽ được đặt tên là background_application và có thể vẽ màu được đặt tên là background_white_transparent. Cả hai đều có nền tảng trong đó ... Tôi đã thấy trên một số luồng khác, điều tương tự cũng xảy ra với những người khác vì vậy tôi đã gửi đó là một trong nhiều lỗi Android và cải tiến toàn bộ bố cục của mình để giải quyết nó.
Yahel

@Yahel Mmm ... Tôi thấy vấn đề đó nhưng trong trường hợp của tôi không phải là các tên tệp giống nhau ... Kiểm tra câu hỏi của tôi tại đây stackoverflow.com/questions/9004744/…
Jona

đã không quản lý để làm cho nó hoạt động, câu trả lời từ Benoit Martin hoạt động tốt.
Emmanuel Touzery

83

Một giải pháp thậm chí còn đơn giản hơn cho những điều trên:

<?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>

Lưu nó trong thư mục có thể vẽ và bạn đã sẵn sàng.


1
Có thể điều này hoạt động, nhưng chính thức không được hỗ trợ (Android Studio coi nó như một lỗi).
Blackhex

@Blackhex Lạ thật. Hoạt động tốt đối với tôi trong Eclipse. Đó có thể là lỗi Lint và nếu có, bạn có thể tắt hoặc bỏ qua nó.
Jason Robinson,

6
Đây là những gì tôi sẽ xem xét giải pháp.
Lay González

<item android:state_pressed="true" android:color="@color/vantablack"/>trông ngữ nghĩa y hệt<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis

16

Ngay cả điều này cũng hoạt động.

<?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>

Tôi đã thêm android:drawablethuộc tính vào từng mục và giá trị của chúng là màu sắc.

Nhân tiện, tại sao họ nói rằng đó colorlà một trong những thuộc tính của selector? Họ không viết điều đó android:drawablelà bắt buộc.

Tài nguyên Danh sách Trạng thái Màu

<?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>

thuộc tính màu hoạt động khi bạn đang thiết về màu sắc TextView nhưng không phải với nền là thực sự là màu sắc trên backround đang hành động như ColorDrawable
Akhil Dad

Giải pháp tốt nhất và dễ nhất để thực hiện tất cả những điều trên.
4gus71n

6

Đối với những người đang tìm kiếm để làm điều đó mà không cần tạo khu vực nền, chỉ cần thêm các dòng đó vào TextView

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

Ngoài ra, để làm cho nó có thể lựa chọn sử dụng:

android:textIsSelectable="true"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.