web-dev-qa-db-fra.com

Android: Utilisation du sélecteur pour définir la couleur d'arrière-plan de l'affichage des images

J'essaie de définir la couleur d'arrière-plan d'une vue d'image. 

 <ImageView 
     Android:id="@+id/my_image"
     Android:src="@drawable/my_icon"
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"    
     Android:layout_weight="1"  
     Android:clickable="true" 
     Android:layout_alignParentLeft="true"
     Android:background="@drawable/selector_image_view" /> 

J'utilise le sélecteur suivant.

 <?xml version="1.0" encoding="utf-8"?> 
 <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">     
 <item Android:state_selected="true" Android:background="@color/Violet" />    
 <item Android:state_pressed="true" Android:background="@color/red" />
 <item Android:background="@color/white" />
 </selector>

Mais il se bloque si j'essaie d'utiliser le sélecteur avec une exception d'exécution. Qu'est-ce que je fais mal?

Mon logcat

E/AndroidRuntime( 4196): FATAL EXCEPTION: main
E/AndroidRuntime( 4196): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.X.XCamera/com.X.XCamera.XCameraActivity}: Android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>
E/AndroidRuntime( 4196):    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2663)
E/AndroidRuntime( 4196):    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
E/AndroidRuntime( 4196):    at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
E/AndroidRuntime( 4196):    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
E/AndroidRuntime( 4196):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
E/AndroidRuntime( 4196):    at Android.os.Looper.loop(Looper.Java:123)
E/AndroidRuntime( 4196):    at Android.app.ActivityThread.main(ActivityThread.Java:4627)
E/AndroidRuntime( 4196):    at Java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4196):    at Java.lang.reflect.Method.invoke(Method.Java:521)
E/AndroidRuntime( 4196):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:858)
E/AndroidRuntime( 4196):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
E/AndroidRuntime( 4196):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 4196): Caused by: Android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.createView(LayoutInflater.Java:513)
E/AndroidRuntime( 4196):    at com.Android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.Java:56)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:563)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:618)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:621)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:407)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:320)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:276)
E/AndroidRuntime( 4196):    at com.X.XCamera.Settings.<init>(Settings.Java:52)
E/AndroidRuntime( 4196):    at com.X.XCamera.XCameraActivity.onCreate(XCameraActivity.Java:92)
E/AndroidRuntime( 4196):    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
E/AndroidRuntime( 4196):    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2627)
E/AndroidRuntime( 4196):    ... 11 more
E/AndroidRuntime( 4196): Caused by: Java.lang.reflect.InvocationTargetException
E/AndroidRuntime( 4196):    at Android.widget.ImageView.<init>(ImageView.Java:108)
E/AndroidRuntime( 4196):    at Java.lang.reflect.Constructor.constructNative(Native Method)
E/AndroidRuntime( 4196):    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:446)
E/AndroidRuntime( 4196):    at Android.view.LayoutInflater.createView(LayoutInflater.Java:500)
E/AndroidRuntime( 4196):    ... 22 more
E/AndroidRuntime( 4196): Caused by: Android.content.res.Resources$NotFoundException: File res/drawable/selector_image_view.xml from drawable resource ID #0x7f02000e
E/AndroidRuntime( 4196):    at Android.content.res.Resources.loadDrawable(Resources.Java:1697)
E/AndroidRuntime( 4196):    at Android.content.res.TypedArray.getDrawable(TypedArray.Java:601)
E/AndroidRuntime( 4196):    at Android.view.View.<init>(View.Java:2045)
E/AndroidRuntime( 4196):    at Android.widget.ImageView.<init>(ImageView.Java:112)
E/AndroidRuntime( 4196):    ... 26 more
E/AndroidRuntime( 4196): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #3: <item> tag requires a 'drawable' attribute or child tag defining a drawable
E/AndroidRuntime( 4196):    at Android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.Java:167)
E/AndroidRuntime( 4196):    at Android.graphics.drawable.Drawable.createFromXmlInner(Drawable.Java:787)
E/AndroidRuntime( 4196):    at Android.graphics.drawable.Drawable.createFromXml(Drawable.Java:728)
E/AndroidRuntime( 4196):    at Android.content.res.Resources.loadDrawable(Resources.Java:1694)
E/AndroidRuntime( 4196):    ... 29 more
W/ActivityManager( 1707):   Force finishing activity com.X.XCamera/.XCameraActivity
I/IMGSRV  ( 1707): gralloc.c:803: gralloc_device_alloc: Allocated a new surface:
I/IMGSRV  ( 1707):        width -> 800
I/IMGSRV  ( 1707):       height -> 382
I/IMGSRV  ( 1707):       format -> 1 (HAL_PIXEL_FORMAT_RGBA_8888)
13
Namratha

Votre Logcat:

E/AndroidRuntime (4196): Causé par: org.xmlpull.v1.XmlPullParserException: ligne de fichier XML binaire # 3: balise nécessite un attribut 'drawable' ou une balise enfant définissant un drawable

LogCat indique que votre balise <item> devrait inclure la balise Android:drawable.

Votre fichier de sélecteur devrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">     
     <item Android:state_selected="true" Android:drawable="@color/Violet" />    
     <item Android:state_pressed="true" Android:drawable="@color/red" />
     <item Android:drawable="@color/white" />
</selector>
37
Adil Soomro

Le moyen le plus simple de faire ce que vous voulez est d'ajouter un nœud enfant à l'élément au lieu d'utiliser son attribut drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true">
        <color Android:color="@color/Violet" />
    </item>
    <item Android:state_pressed="true">
        <color Android:color="@color/red" />
    </item>
    <item>
        <color Android:color="@color/white" />
    </item>
</selector>

Ici, vous pouvez également utiliser des valeurs directes pour la couleur (par exemple # FFFF0000 au lieu de "@ color/red") pour éviter de définir plusieurs ressources de couleur.

17
JBM

Vous ne pouvez pas utiliser de balise d'arrière-plan dans le fichier sélecteur. Au lieu de cela, vous pouvez l'utiliser comme suit:

1. Créez un fichier color.xml dans le dossier "values" sous le dossier "res":

color.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="color_one">#110000</drawable>
    <drawable name="color_two">#001111</drawable>
    <drawable name="color_three">#001100</drawable>    
</resources>

2. Maintenant, utilisez ce fichier dans votre fichier de sélecteur comme:

 <?xml version="1.0" encoding="utf-8"?> 
 <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">     
     <item Android:state_selected="true" Android:drawable="@drawable/color_one" />    
     <item Android:state_pressed="true" Android:drawable="@drawable/color_two" />
     <item Android:drawable="@drawable/color_three"/>
 </selector>
14
Hiral

Le meilleur moyen d'implémenter le sélecteur est d'utiliser le XML au lieu d'utiliser la méthode de programmation comme plus facile à implémenter avec XML.

    <?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
       <item Android:state_selected="true">
    <color Android:color="@color/Violet" />
</item>
<item Android:state_pressed="true">
    <color Android:color="@color/red" />
</item>
<item>
    <color Android:color="@color/white" />
</item>

    </selector>

Pour plus d'informations, j'ai utilisé ce lien http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html

1
Bhushan Shirsath
 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:drawable="@color/black_mediam" />
    <item Android:state_pressed="true" Android:drawable="@color/black_mediam" />
    <item Android:drawable="@color/menu_bg" />
</selector>

cela fonctionne pour ImageView et Button 

      <Button
            Android:layout_weight="1"
            Android:background="@drawable/image_selecter"
            Android:id="@+id/btn_delete_gif"
            Android:textAllCaps="false"
            Android:text="Yes"
            Android:textSize="@dimen/_13sdp"
            Android:textColor="@Android:color/white"
            Android:layout_width="175dp"
            Android:layout_height="wrap_content" />


     <ImageView
            Android:padding="@dimen/_3sdp"
            Android:background="@drawable/image_selecter"
            Android:layout_weight="1"
            Android:layout_alignParentRight="true"
            Android:id="@+id/delete_gif_giflistview"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/ic_delete_gif"
            Android:layout_marginLeft="1dp" />
0
Virani Ashish