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>
Và loading_icon_help
chỉ là một hình ảnh PNG.
Bảng vẽ 'loading_button_help' và' loading_icon_help' là gì? –
@ 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
Bạn có thể cung cấp xml của mình không? –