安卓:充气布局时的StackOverflowError用的InvocationTargetException布局、StackOverflowError、InvocationTargetExceptio

2023-09-08 00:21:14 作者:不俗

首先,对不起我的英语。我有一个问题充气布局时:

First, sorry for my English. I have a question when inflating layout:

我有一个自定义视图,从扩展的LinearLayout,名为 ButtonHelp 。我用我的布局,视图名为 LoadingActivity 。我下面$ C $每个CS设备和仿真器上的完美,除了那些具有QVGA屏幕,像三星Galaxy Y中以下错误:

I have a custom view, extends from a LinearLayout, called ButtonHelp. I use that view on my layout named LoadingActivity. My below codes work perfectly on every devices and emulators, except ones with QVGA screen like Samsung Galaxy Y with following errors:

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.

问题是,我不知道这行的想法:

The problem is, I have no idea about this line:

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

为什么会发生在QVGA模拟器/设备?

Why does it happen on QVGA emulators/devices?

FYI:

我有分辨率320x480的屏幕只。图像资源

ButtonHelp 布局:

<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 code:

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 在使用 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>

当我删除的 ButtonHelp ,错误创建布局时,就像上面的logcat仍然出现。

When I remove ButtonHelp, the error still appears when creating layout, just like above logcat.

我已经搜查另一SO问题,但仍然有这种情况下没有解决方案或解释。

I've searched another SO questions but still have no solution or explanation for this case.

非常感谢!

至于问,以下是codeS为 loading_button_help

As asked, below are codes for 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 只是一个PNG图像。

And loading_icon_help is just a PNG image.

推荐答案

在您使用@绘制/ loading_button_help loading_button_help.xml?我觉得你有循环引用。尝试重命名你的XML或图像文件。

In loading_button_help.xml you use @drawable/loading_button_help? I think you have cyclic reference. Try to rename your xml or image file.