2012-02-27 26 views
5

Trước tiên, xin lỗi vì tiếng Anh của tôi. Tôi có câu hỏi khi tăng bố cục:Android: StackOverFlowError với InvocationTargetException khi tăng bố cục

Tôi có chế độ xem tùy chỉnh, mở rộng từ LinearLayout, được gọi là ButtonHelp. Tôi sử dụng chế độ xem đó trên bố cục của tôi có tên LoadingActivity. mã dưới đây của tôi hoạt động hoàn hảo trên tất cả các thiết bị và giả lập, ngoại trừ những người thân với màn hình QVGA như Samsung Galaxy Y với các lỗi sau đây:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.LoadingActivity}: android.view.InflateException: Binary XML file line #45: Error inflating class com.myapp.customviews.ButtonHelp 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.InflateException: Binary XML file line #45: Error inflating class com.myapp.customviews.ButtonHelp 
    at android.view.LayoutInflater.createView(LayoutInflater.java:518) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207) 
    at android.app.Activity.setContentView(Activity.java:1657) 
    at com.myapp.LoadingActivity.onCreate(LoadingActivity.java:45) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    ... 11 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
    ... 21 more 
Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class android.widget.ImageButton 
    at android.view.LayoutInflater.createView(LayoutInflater.java:518) 
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
    at com.myapp.customviews.ButtonHelp.initLayout(ButtonHelp.java:29) 
    at com.myapp.customviews.ButtonHelp.<init>(ButtonHelp.java:17) 
    ... 24 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
    ... 32 more 
Caused by: java.lang.StackOverflowError 
    at android.util.LongSparseArray.get(LongSparseArray.java:79) 
    at android.content.res.Resources.getCachedDrawable(Resources.java:1746) 
    at android.content.res.Resources.loadDrawable(Resources.java:1664) 
    at android.content.res.Resources.getDrawable(Resources.java:581) 
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:162) 
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787) 
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:728) 
    at android.content.res.Resources.loadDrawable(Resources.java:1694) 
    at android.content.res.Resources.getDrawable(Resources.java:581) 
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:162) 
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable. 

Vấn đề là, tôi không có ý tưởng về dòng này:

Caused by: java.lang.StackOverflowError 
    at android.util.LongSparseArray.get(LongSparseArray.java:79) 

Tại sao nó lại xuất hiện trên các thiết bị/thiết bị QVGA?

FYI:

  • Tôi có nguồn tài nguyên hình ảnh cho màn hình 320x480 mà thôi.
  • ButtonHelp bố trí:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 
    
    <ImageButton 
        android:id="@+id/btnhelp_help" 
        android:layout_width="40dp" 
        android:layout_height="40dp" 
        android:layout_marginLeft="5dp" 
        android:layout_marginRight="5dp" 
        android:layout_marginTop="5dp" 
        android:background="@drawable/loading_button_help" 
        android:src="@drawable/loading_icon_help" /> 
    </LinearLayout> 
    
  • ButtonHelp mã:

    public class ButtonHelp extends LinearLayout { 
        private ImageButton mHelp; 
    
        public ButtonHelp(Context context, AttributeSet attrs) { 
         super(context, attrs); 
         initLayout(); 
         initControls(); 
        } 
    
        public ButtonHelp(Context context) { 
         super(context); 
         initLayout(); 
         initControls(); 
        } 
    
        private void initLayout() { 
         LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
         inflater.inflate(R.layout.btn_help, this); 
        } 
    
        private void initControls() { 
         mHelp = (ImageButton) findViewById(R.id.btnhelp_help); 
        } 
    
        public void setOnClickListener(View.OnClickListener listener) { 
         mHelp.setOnClickListener(listener); 
        } 
    } 
    
  • ButtonHelp được sử dụng trong LoadingActivity:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/RelativeLayout1" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:background="@drawable/loading_background" 
        android:orientation="vertical" > 
    
    ... 
    
        <com.myapp.customviews.ButtonHelp 
         android:id="@+id/loading_help" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentRight="true" 
         android:layout_alignParentTop="true" /> 
    
    ... 
    
    </RelativeLayout> 
    
  • Khi tôi xóa NútHelp, lỗi vẫn xuất hiện khi tạo bố cục, giống như logcat ở trên.

Tôi đã tìm kiếm một câu hỏi SO khác nhưng vẫn không có giải pháp hoặc giải thích cho trường hợp này.

Rất cám ơn!


UPDATE:

Như hỏi, dưới đây là mã cho loading_button_help:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_window_focused="false" android:state_enabled="true" 
     android:drawable="@drawable/loading_button_help" /> <!-- Normal --> 

    <item android:state_window_focused="false" android:state_enabled="false" 
     android:drawable="@drawable/loading_button_help" /> <!-- Normal disable --> 

    <item android:state_pressed="true" 
     android:drawable="@drawable/loading_button_help_press" /> <!-- pressed --> 

    <item android:state_focused="true" android:state_enabled="true" 
     android:drawable="@drawable/loading_button_help" /> <!-- selected --> 

    <item android:state_enabled="true" 
     android:drawable="@drawable/loading_button_help" /> <!-- normal --> 

    <item android:state_focused="true" 
     android:drawable="@drawable/loading_button_help" /> <!-- normal disable focused --> 

    <item 
     android:drawable="@drawable/loading_button_help" /> <!-- normal disable --> 
</selector> 

loading_icon_help chỉ là một hình ảnh PNG.

+0

Bảng vẽ 'loading_button_help' và' loading_icon_help' là gì? –

+0

@ a.ch. 'loading_button_help': là một nút định nghĩa xml định nghĩa có thể vẽ được và' loading_icon_help' là một hình ảnh có thể vẽ được. – thaiduy

+0

Bạn có thể cung cấp xml của mình không? –

Trả lời

3

Trong loading_button_help.xml bạn sử dụng @ drawable/loading_button_help? Tôi nghĩ rằng bạn có tham khảo tuần hoàn. Hãy thử đổi tên tệp xml hoặc hình ảnh của bạn.

+0

Cảm ơn bạn @appserv. Xấu của tôi, không biết tại sao tôi không nhận thấy nó ở lần đầu tiên. – thaiduy

Các vấn đề liên quan