android.view.InflateException:二进制XML文件行#2:错误膨胀类<unknown>

我开发一个简单的应用程序。 刚刚完成主屏幕。 如果方向改变两次以上,则抛出错误,应用程序强制closures。

我的活动代码:

public class PasswordActivity extends Activity implements OnClickListener { Button login; Button forgot; Button register; private static final String PREFERENCES = "prefs"; private static final String PREFERENCES_NAME = "pref_name"; SharedPreferences settings; private Cursor c; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); login=(Button)findViewById(R.id.login_login); login.setOnClickListener(this); register=(Button)findViewById(R.id.login_register); register.setOnClickListener(this); } public void onClick(View v) { } } 

我的Xml代码:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/listpic" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="5dp" android:paddingLeft="3dp" android:paddingRight="3dp" > <TextView android:layout_width="fill_parent" android:layout_weight="0.75" android:layout_height="wrap_content" android:text="@string/login_user_name" android:textStyle="bold" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.25" android:id="@+id/login_user_name" android:inputType="text" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="3dp" android:paddingRight="3dp" > <TextView android:layout_width="fill_parent" android:layout_weight="0.75" android:layout_height="wrap_content" android:text="@string/login_password" android:textStyle="bold" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.25" android:inputType="textPassword" android:id="@+id/login_password" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="3dp" android:paddingRight="3dp" > <Button style="@style/left_button" android:text="@string/login_submit" android:id="@+id/login_login" /> <Button style="@style/right_button" android:id="@+id/login_register" android:text="@string/register" /> </LinearLayout> </LinearLayout> 

日志猫详细信息:

 10-21 12:05:59.982: D/dalvikvm(622): GC_EXTERNAL_ALLOC freed 774 objects / 56240 bytes in 61ms 10-21 12:06:15.031: D/dalvikvm(622): GC_EXTERNAL_ALLOC freed 737 objects / 30992 bytes in 59ms 10-21 12:06:18.022: E/dalvikvm-heap(622): 7596000-byte external allocation too large for this process. 10-21 12:06:18.022: E/GraphicsJNI(622): VM won't let us allocate 7596000 bytes 10-21 12:06:18.043: D/AndroidRuntime(622): Shutting down VM 10-21 12:06:18.043: W/dalvikvm(622): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 10-21 12:06:18.092: E/AndroidRuntime(622): FATAL EXCEPTION: main 10-21 12:06:18.092: E/AndroidRuntime(622): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ravi.password/com.ravi.password.PasswordActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> 10-21 12:06:18.092: E/AndroidRuntime(622): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.app.ActivityThread.main(ActivityThread.java:4627) 10-21 12:06:18.092: E/AndroidRuntime(622): at java.lang.reflect.Method.invokeNative(Native Method) 10-21 12:06:18.092: E/AndroidRuntime(622): at java.lang.reflect.Method.invoke(Method.java:521) 10-21 12:06:18.092: E/AndroidRuntime(622): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 10-21 12:06:18.092: E/AndroidRuntime(622): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 10-21 12:06:18.092: E/AndroidRuntime(622): at dalvik.system.NativeStart.main(Native Method) 10-21 12:06:18.092: E/AndroidRuntime(622): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.createView(LayoutInflater.java:513) 10-21 12:06:18.092: E/AndroidRuntime(622): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.inflate(LayoutInflater.java:385) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 10-21 12:06:18.092: E/AndroidRuntime(622): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.app.Activity.setContentView(Activity.java:1647) 10-21 12:06:18.092: E/AndroidRuntime(622): at com.ravi.password.PasswordActivity.onCreate(PasswordActivity.java:34) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 10-21 12:06:18.092: E/AndroidRuntime(622): ... 12 more 10-21 12:06:18.092: E/AndroidRuntime(622): Caused by: java.lang.reflect.InvocationTargetException 10-21 12:06:18.092: E/AndroidRuntime(622): at android.widget.LinearLayout.<init>(LinearLayout.java:115) 10-21 12:06:18.092: E/AndroidRuntime(622): at java.lang.reflect.Constructor.constructNative(Native Method) 10-21 12:06:18.092: E/AndroidRuntime(622): at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.LayoutInflater.createView(LayoutInflater.java:500) 10-21 12:06:18.092: E/AndroidRuntime(622): ... 22 more 10-21 12:06:18.092: E/AndroidRuntime(622): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.Bitmap.nativeCreate(Native Method) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.Bitmap.createBitmap(Bitmap.java:468) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.Bitmap.createBitmap(Bitmap.java:435) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 10-21 12:06:18.092: E/AndroidRuntime(622): at android.view.ViewGroup.<init>(ViewGroup.java:285) 10-21 12:06:18.092: E/AndroidRuntime(622): ... 26 more 

图像的大小在5kb左右。

在运行时,Android根据需要调整图像的大小(基于屏幕大小和分辨率)。 它使用位图来进行内部大小调整。 显然,这是非常强大的内存(有点疯狂分配内存)。 解决此类问题的一个快速方法是将所有可绘制文件复制到drawable-ldpi,mdpi,hdpi文件夹。 这样,Android将只是从这些文件夹中挑选文件,而不是调整它们的大小。

它是一个随机的例外,一个真正的痛苦来解决。

请按照背景图片尺寸

为受支持的设备

 LDPI: Portrait: 200x320px Landscape: 320x200px MDPI: Portrait: 320x480px Landscape: 480x320px HDPI: Portrait: 480x800px Landscape: 800x480px XHDPI: Portrait: 720px1280px Landscape: 1280x720px