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)
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>
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.
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>
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
<?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" />