2012-01-10 43 views
13

Tôi đang cố gắng đặt màu nền của chế độ xem hình ảnh.Android: Sử dụng bộ chọn để đặt màu nền cho chế độ xem hình ảnh

<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" /> 

Tôi đang sử dụng công cụ chọn sau.

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

Nhưng, sự cố xảy ra nếu tôi cố gắng sử dụng bộ chọn có ngoại lệ thời gian chạy. Tôi đang làm gì sai?

logcat My

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) 
+1

bạn có thể gửi logcat của bạn ?? – Hiral

Trả lời

36

Logcat của bạn:

E/AndroidRuntime (4196): Nguyên nhân: org.xmlpull .v1.XmlPullParserException: Dòng tệp XML nhị phân # 3: thẻ yêu cầu thuộc tính 'drawable' hoặc thẻ con xác định drawable

LogCat đang chỉ ra rằng thẻ <item> của bạn nên bao gồm thẻ android:drawable.

Bạn chọn tập tin này sẽ trông như thế này:

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

Bạn không thể sử dụng thẻ nền trong selector file.Instead, bạn có thể sử dụng nó như:

1. Tạo một color.xml trong "giá trị" thư mục trong thư mục "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. Bây giờ, sử dụng tập tin này trong tập tin chọn của bạn như:

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

Nếu không phải là thay vì ?Tôi không chắc chắn về câu trả lời thứ, vì vậy tôi cụm từ đó như một câu hỏi chứ không phải là một sự điều chỉnh. Nếu bạn có thể làm rõ, tôi sẽ biết ơn. Cảm ơn. –

16

Cách đơn giản nhất để làm những gì bạn muốn là thêm một nút con đến mục thay vì sử dụng drawable thuộc tính của nó:

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

đây bạn có thể sử dụng các giá trị trực tiếp cho màu sắc (ví dụ # FFFF0000 thay vì "@ color/red") để tiết kiệm cho mình khỏi việc xác định nhiều tài nguyên màu.

1

Cách tốt nhất để triển khai bộ chọn là sử dụng xml thay vì sử dụng cách lập trình vì nó dễ dàng hơn để triển khai với 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> 

Để biết thêm thông tin tôi được thực hiện sử dụng liên kết này http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html

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

nó đang làm việc cho ImageView và 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" /> 
Các vấn đề liên quan