Pemilih pada warna latar TextView

121

Saya mencoba mengubah warna latar belakang TextViewwidget Android saat pengguna menyentuhnya. Saya telah membuat selektor untuk tujuan itu, yang disimpan res/color/selector.xmldan secara kasar terlihat seperti itu:

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

The clickableatribut dari TextViewini true, dalam kasus itu menarik.

Ketika saya menetapkan pemilih ini ke TextViewsebagai android:background="@color/selector", saya mendapatkan pengecualian berikut saat runtime:

ERROR / AndroidRuntime (13130): Disebabkan oleh: org.xmlpull.v1.XmlPullParserException: Baris file XML biner # 6: tag memerlukan atribut 'drawable' atau tag turunan yang mendefinisikan drawable

Saat saya mengubah atribut menjadi drawable, ini berfungsi, tetapi hasilnya terlihat salah karena ID tampaknya ditafsirkan sebagai referensi gambar, bukan referensi warna (seperti yang disarankan "drawable").

Yang membingungkan saya adalah saya dapat menetapkan referensi warna, misalnya "@ color / black", sebagai atribut latar belakang secara langsung. Ini bekerja seperti yang diharapkan. Menggunakan selektor tidak berfungsi.

Saya juga dapat menggunakan selektor sebagai textColortanpa masalah.

Apa cara yang benar untuk menerapkan pemilih warna latar belakang ke TextViewdi Android?

digitalbreed
sumber
Sebuah warna bisa diartikan sebagai drawable. Bagaimana tepatnya hasilnya salah?
Romain Guy
Ini tidak menunjukkan warna tetapi gambar dari sumber daya dapat digambar saya sebagai latar belakang.
digitalbreed
2
Hal di atas seharusnya berfungsi, jika Anda menggunakan android: drawable, bukan android: color - setidaknya dalam kasus itu, ini berfungsi untuk saya: android: drawable = "@ color / my_custom_color". Warna saya ditentukan dalam values ​​/ colors.xml
AgentKnopf

Jawaban:

226

Masalahnya di sini adalah Anda tidak dapat menentukan warna latar belakang menggunakan pemilih warna, Anda memerlukan pemilih yang dapat digambar . Jadi, perubahan yang diperlukan akan terlihat seperti ini:

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

Anda juga perlu memindahkan sumber daya tersebut ke drawabledirektori yang lebih masuk akal karena ini bukan pemilih warna.

Maka Anda harus membuat res/drawable/selected_state.xmlfile seperti ini:

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

dan akhirnya, Anda akan menggunakannya seperti ini:

android:background="@drawable/selector"

Catatan : alasan mengapa OP mendapatkan sumber gambar yang digambar mungkin karena dia mencoba untuk hanya mereferensikan sumber dayanya yang masih dalam direktori warna tetapi menggunakannya @drawablesehingga dia berakhir dengan benturan ID, memilih sumber daya yang salah.

Semoga ini masih dapat membantu seseorang bahkan jika OP mungkin telah, saya harap, menyelesaikan masalahnya sekarang.

Benoit Martin
sumber
1
Terima kasih, Benoit. Masalahnya terpecahkan (harus saya akui, saya tidak ingat bagaimana tepatnya saya melakukannya pada akhirnya) dan proyek berhasil diselesaikan. Saya menghargai Anda kembali ke sini untuk memposting dan membantu orang-orang yang mengalami masalah yang sama di masa mendatang, semangat!
digitalbreed
Saya tidak bisa membuat ini berhasil. Saya mencoba menerapkannya ke tombol dan itu mengatur latar belakang ke warna default selector, tetapi itu tidak berubah ke bentuk yang ditentukan dalam state_pressed. Apa yang bisa saya lewatkan? Saya mungkin membuka pertanyaan baru, kalau-kalau Anda bisa mengarahkan saya ke arah yang benar.
Maragues
@Maragues sulit untuk membedakan tanpa melihat kode apapun. Saya sarankan Anda membuka pertanyaan baru dan memposting kode yang relevan sehingga kami dapat menemukan apa yang salah. Anda juga dapat menambahkan komentar ke posting ini dengan link ke posting baru Anda.
Benoit Martin
9
Mengapa tidak menggunakan "drawable =" @ color / your_color "secara langsung di item pemilih? Anda tidak perlu menentukan bentuk atau file lain apa pun, cukup gunakan definisi warna Anda di values ​​/ colors.xml (selalu bagus bukan untuk warna hardcode).
javaxian
Tidak bekerja. Ini menunjukkan kepada saya warna yang berbeda dari keduanya yang telah saya nyatakan dalam bentuk xml.
Er.Rohit Sharma
122

Solusi Benoit berfungsi, tetapi Anda benar-benar tidak perlu mengeluarkan biaya overhead untuk menggambar bentuk. Karena warna bisa digambar, cukup tentukan warna dalam file /res/values/colors.xml:

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

Dan kemudian gunakan seperti itu di pemilih Anda:

<?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>
azdev
sumber
Untuk beberapa alasan, solusi Anda tidak menunjukkan warna tetapi gambar acak dari folder resource drawable saya. Saya mencoba membersihkan proyek / memperbaiki properti / menyimpan kembali / membuka kembali gerhana karena kelihatannya sangat aneh, tetapi tidak berhasil. Aneh.
Yahel
@Yahel Anda mungkin menamai resource drawable warna sama dengan file drawable sebenarnya?
Jona
@ Jona: Tidak, tetapi drawable dinamai background_application dan drawable warna dinamai background_white_transparent. Keduanya memiliki latar belakang di dalamnya ... Saya telah melihat di beberapa utas lain hal yang sama terjadi pada orang lain jadi saya mengajukannya sebagai salah satu dari banyak bug Android dan mengubah seluruh tata letak saya untuk mengatasinya.
Yahel
@Yahel Mmm ... Yah, saya melihat masalah itu tetapi dalam kasus saya bukan nama file yang sama ... Lihat pertanyaan saya di sini stackoverflow.com/questions/9004744/…
Jona
tidak berhasil, jawaban dari Benoit Martin bekerja dengan baik.
Emmanuel Touzery
83

Solusi yang lebih sederhana untuk hal di atas:

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

Simpan itu di folder drawable dan Anda siap menggunakannya.

Jason Robinson
sumber
1
Mungkin ini berfungsi, tetapi secara resmi tidak didukung (Android Studio memperlakukannya sebagai kesalahan).
Blackhex
@Tokopedia Bekerja dengan baik untuk saya di Eclipse. Ini mungkin kesalahan Lint, dan jika ya, Anda harus dapat menonaktifkan atau mengabaikannya.
Jason Robinson
6
Inilah yang akan saya pertimbangkan sebagai solusinya.
Lay González
<item android:state_pressed="true" android:color="@color/vantablack"/>terlihat semantik identik dengan<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis
16

Bahkan ini berhasil.

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

Saya menambahkan android:drawableatribut ke setiap item, dan nilainya adalah warna.

Ngomong-ngomong, mengapa mereka mengatakan itu coloradalah salah satu atribut dari selector? Mereka tidak menulis itu android:drawablewajib.

Sumber Daya Daftar Status Warna

<?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>
Maksim Dmitriev
sumber
atribut warna berfungsi saat Anda menyetel warna textview tetapi tidak dengan latar belakang karena sebenarnya warna pada latar belakang bertindak sebagai ColorDrawable
Akhil Dad
Solusi terbaik dan termudah untuk menerapkan semua di atas.
4gus71n
6

Bagi yang mencari untuk melakukannya tanpa membuat sektor latar belakang, cukup tambahkan baris tersebut ke TextView

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

Juga untuk membuatnya dapat dipilih, gunakan:

android:textIsSelectable="true"
Dasser Basyouni
sumber