TextView arka plan rengindeki seçici


121

TextViewKullanıcı dokunduğunda bir Android widget'ın arka plan rengini değiştirmeye çalışıyorum . Bu amaçla, içinde depolanan res/color/selector.xmlve kabaca şöyle görünen bir seçici oluşturdum :

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

clickableNiteliği TextViewolan trueilgi ihtimaline karşı,.

Bu seçiciyi bir TextViewolarak android:background="@color/selector"atadığımda, çalışma zamanında şu istisnayı alıyorum:

HATA / AndroidRuntime (13130): Nedeni: org.xmlpull.v1.XmlPullParserException: İkili XML dosyası satır # 6: etiket, bir çekilebilir tanımlayan bir 'çekilebilir' özniteliği veya alt etiket gerektirir

Özniteliği çizilebilir olarak değiştirdiğimde işe yarıyor, ancak sonuç tamamen yanlış görünüyor çünkü kimlikler renk referansları yerine görüntü referansları olarak yorumlanıyor gibi görünüyor ("çizilebilir" in önerdiği gibi).

Kafamı karıştıran şey, bir renk referansını, örneğin "@ color / black", doğrudan arka plan özelliği olarak ayarlayabilmem. Bu beklendiği gibi çalışıyor. Seçicileri kullanmak işe yaramıyor.

Seçiciyi textColorproblemsiz olarak da kullanabilirim .

TextViewAndroid'de bir arka plan rengi seçiciyi uygulamanın doğru yolu nedir ?


Bir renk, çizilebilir olarak yorumlanabilir. Sonuç tam olarak nasıl yanlış?
Romain Guy

Rengi değil, onun yerine arka plan olarak çekilebilir kaynaklarımdan bir görüntü gösteriyor.
digitalbreed

2
Eğer android: drawable kullanıyorsanız, android: color kullanıyorsanız, yukarıdakiler çalışmalıdır - en azından bu durumda benim için çalışıyor: android: drawable = "@ color / my_custom_color". Benim renkler değerler / colors.xml tanımlanmıştır
AgentKnopf

Yanıtlar:


226

Buradaki sorun, bir renk seçici kullanarak arka plan rengini tanımlayamamanız, bir çekilebilir seçiciye ihtiyacınız olmasıdır . Dolayısıyla, gerekli değişiklikler şöyle görünecektir:

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

Ayrıca, bu kaynağı drawablekendi başına bir renk seçici olmadığı için daha anlamlı olacağı dizine taşımanız gerekir .

O zaman res/drawable/selected_state.xmldosyayı şu şekilde oluşturmanız gerekir :

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

ve son olarak, bunu şu şekilde kullanırsınız:

android:background="@drawable/selector"

Not : OP'nin çizilen bir görüntü kaynağını almasının nedeni muhtemelen sadece renk dizininde olan kaynağına başvurmaya çalıştığı, ancak @drawablebu yüzden kullandığı bir kimlik çakışmasıyla sonuçlanarak yanlış kaynağı seçmesidir.

Umarım OP muhtemelen problemini şimdiye kadar çözmüş olsa bile, bu hala birilerine yardımcı olabilir.


1
Teşekkürler Benoit. Sorun çözüldü (itiraf etmeliyim ki sonunda tam olarak nasıl yaptığımı hatırlayamıyorum) ve proje başarıyla tamamlandı. Gelecekte aynı sorunu çözecek insanlara yardım etmek için buraya geri geldiğin için minnettarım, büyük ruh!
digitalbreed

Bu işi yapamam. Bunu bir düğmeye uygulamaya çalışıyorum ve arka planı seçicinin varsayılan rengine ayarlıyor, ancak state_pressed'de tanımlanan şekle değişmiyor. Ne eksik olabilirim? Beni doğru yöne yönlendirebilirsin diye, yeni bir soru açabilirim.
Maragues

@Maragues herhangi bir kod görmeden söylemek zor. Neyin yanlış olabileceğini anlayabilmemiz için yeni bir soru açmanızı ve ilgili kodu göndermenizi tavsiye ederim. Bu gönderiye, yeni yayınınıza bağlantı içeren bir yorum da ekleyebilirsiniz.
Benoit Martin

9
Neden bunun yerine "drawable =" @ color / your_color "öğesini doğrudan seçici öğelerinizde kullanmıyorsunuz? Herhangi bir şekil veya başka dosya tanımlamanıza gerek yok, yalnızca renk tanımlarınızı values.xml dosyasında bulundurun (her zaman iyidir renkleri sabit
kodlamayın

Çalışmıyor. Bana xml'ler şeklinde beyan ettiğimden farklı bir renk gösteriyor.
Er.Rohit Sharma

122

Benoit'in çözümü işe yarıyor, ancak bir şekil çizmek için gerçekten ek yüke girmenize gerek yok. Renkler çizilebilir olabileceğinden, bir /res/values/colors.xml dosyasında bir renk tanımlamanız yeterlidir:

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

Ve sonra seçicinizde olduğu gibi kullanı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>

Bazı nedenlerden dolayı, çözümünüz rengi değil, çekilebilir kaynaklar klasörümden rastgele bir görüntü gösteriyor. Gerçekten tuhaf göründüğü için projeyi / özellikleri düzeltmeyi / yeniden kaydetmeyi / yeniden açmayı denedim, ancak boşuna. Tuhaf.
Yahel

@Yahel Muhtemelen renkli çekilebilir kaynağı gerçek bir çekilebilir dosya ile aynı şekilde adlandırmışsınızdır?
Jona

@Jona: Hayır, ancak çekilebilir olanın adı background_application ve renkli çizilebilir olanın adı background_white_transparent idi. Her ikisinin de arka planı vardı ... Başka bir iş parçacığında aynı şeyin başkalarına da olduğunu gördüm, bu yüzden bunu sayısız Android hatasından biri olarak dosyaladım ve geçici çözüm için tüm düzenimi yeniledim.
Yahel

@Yahel Mmm ... Bu sorunu görüyorum ama benim durumumda aynı dosya isimleri değil ... Sorularıma buradan göz
Jona

işe yaramadı, Benoit Martin'in cevabı iyi çalıştı.
Emmanuel Touzery

83

Yukarıdakilere daha da basit bir çözüm:

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

Bunu çekilebilir klasöre kaydedin ve gitmeniz iyi olur.


1
Belki bu işe yarar, ancak resmi olarak desteklenmemektedir (Android Studio bunu bir hata olarak değerlendirir).
Blackhex

@Blackhex Strange. Eclipse'de benim için iyi çalışıyor. Muhtemelen bir Lint hatasıdır ve eğer öyleyse, onu devre dışı bırakabilmeniz veya görmezden gelebilmeniz gerekir.
Jason Robinson

6
Çözüm olarak düşündüğüm şey bu.
Lay González

<item android:state_pressed="true" android:color="@color/vantablack"/>semantik olarak aynı görünüyor<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis

16

Bu bile işe yarıyor.

<?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:drawableHer öğeye özniteliği ekledim ve değerleri renkler.

Bu arada, neden colorbunun özelliklerinden biri olduğunu söylüyorlar selector? android:drawableGerekli olanı yazmıyorlar .

Renk Durumu Listesi Kaynak

<?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 özelliği, textview renklerini ayarladığınızda çalışır, ancak arka plandaki renkler aslında ColorDrawable olarak hareket eder
Akhil Dad

Yukarıdakilerin hepsini uygulamak için en iyi ve en kolay çözüm.
4gus71n

6

Bir arka plan sektörü oluşturmadan bunu yapmak isteyenler için, bu satırları TextView

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

Ayrıca onu seçilebilir hale getirmek için:

android:textIsSelectable="true"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.