无明显原因的方向更改后应用程序崩溃
Posted
技术标签:
【中文标题】无明显原因的方向更改后应用程序崩溃【英文标题】:Application crashes after an orientation change for no apparent reason 【发布时间】:2011-06-30 03:23:00 【问题描述】:编辑版主,请随时删除此问题。问题在于我的背景图像大小,而不是实际的方向变化。
请多多包涵-我不相信这个问题/问题已经用这种简单的术语得到了回答。
我有一个应用程序,其中包含多个活动和 2 个布局资源,每个活动具有相同的 XML 文件名称,存储在 res/layout-land 和 res/layout-port 中。
问题是,当我在 Nexus One(我使用的是 android 2.3)上启动应用程序时,应用程序启动时没有问题,但如果我尝试旋转屏幕(更改方向),它就会崩溃。澄清一下,如果我以手机横向样式启动 Activity,应用程序会向我显示 res/layout-land 资源布局,反之亦然,但如果我尝试在运行时更改方向,它会崩溃。
我相信如果有 2 个 XML 布局,保存在 -port 和 -land 文件夹中,那么 Android 应该销毁该活动并使用另一个同名布局重新创建它,对吗?
这是我的清单,如有必要,我很乐意粘贴更多代码。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dominion.game"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="9" />
<application android:icon="@drawable/icon" android:label="@string/app_name" debuggable="true">
<activity android:name="dominion.game.DominionMenu"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="dominion.game.CreateMenu"
android:label="@string/app_name">
</activity>
<activity android:name="dominion.game.AdvancedMenu"
android:label="@string/app_name">
</activity>
<activity android:name="dominion.game.ShuffleResult"
android:label="@string/app_name">
</activity>
</application>
</manifest>
这里是 onCreate 方法的开始:
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
//...Lots of onClick listeners for the 4 buttons...
其余部分是动作侦听器,如果单击每个按钮,它就会启动另一个活动的意图。主菜单布局对应于 res/layout-land/mainmenu & res/layout-port/mainmenu,至少理论上是这样。
我查看了 DDMS 错误,但没有任何链接指向我的代码中存在错误的某个地方。
编辑:请求错误日志(所有红色的东西,直到强制关闭)-
07-01 00:23:41.082: ERROR/dalvikvm-heap(11182): 9864000-byte external allocation too large for this process.
07-01 00:23:41.109: ERROR/GraphicsJNI(11182): VM won't let us allocate 9864000 bytes
07-01 00:23:41.109: DEBUG/dalvikvm(11182): GC_FOR_MALLOC freed <1K, 52% free 2598K/5379K, external 19819K/19819K, paused 15ms
07-01 00:23:41.117: DEBUG/AndroidRuntime(11182): Shutting down VM
07-01 00:23:41.117: WARN/dalvikvm(11182): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): FATAL EXCEPTION: main
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): java.lang.RuntimeException: Unable to start activity ComponentInfodominion.game/dominion.game.DominionMenu: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2796)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.access$1600(ActivityThread.java:117)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:932)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.os.Looper.loop(Looper.java:123)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.main(ActivityThread.java:3647)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at java.lang.reflect.Method.invokeNative(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at java.lang.reflect.Method.invoke(Method.java:507)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at dalvik.system.NativeStart.main(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.createView(LayoutInflater.java:518)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.Activity.setContentView(Activity.java:1657)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at dominion.game.DominionMenu.onCreate(DominionMenu.java:28)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): ... 12 more
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: java.lang.reflect.InvocationTargetException
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at java.lang.reflect.Constructor.constructNative(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.LayoutInflater.createView(LayoutInflater.java:505)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): ... 22 more
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.Bitmap.nativeCreate(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:463)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:326)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.content.res.Resources.loadDrawable(Resources.java:1709)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.View.<init>(View.java:1951)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.View.<init>(View.java:1899)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.view.ViewGroup.<init>(ViewGroup.java:286)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): at android.widget.LinearLayout.<init>(LinearLayout.java:120)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): ... 25 more
07-01 00:23:41.144: WARN/ActivityManager(113): Force finishing activity dominion.game/.DominionMenu
本质上,我的问题是:需要采取哪些步骤才能使自动屏幕方向更改起作用?我以为我都做了……
非常感谢任何帮助或建议,在此先感谢!
@Rahul Sharma- 这停止了崩溃,但不是切换到另一个布局,它只是在不同的方向上使用相同的布局。
@Asyncronos 我在 2.3 而不是 2.1 但这是一个值得考虑的有趣错误,当然。我不认为我正在使用这些对象。
好的-你们会生气的,但问题是我的背景图像很大-接近 30 英寸 x 30 英寸。所以我把它缩小到大约 7x7 英寸,没有问题......
【问题讨论】:
它崩溃 不是一个充分的错误描述。发布堆栈跟踪。 崩溃的意思是你得到一个Force-Close弹出框?如果是这种情况,你肯定会得到一个 logcat 错误:你可能需要在命令行运行 adb logcat 并观察它以查看错误,但肯定会有一个错误是你的问题的原因。 【参考方案1】:在你的 AndroidManifest.xml 中放
android:configChanges="orientation|keyboardHidden" 在您的所有活动标签中
例如
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dominion.game"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="9" />
<application android:icon="@drawable/icon" android:label="@string/app_name" debuggable="true">
<activity android:name="dominion.game.DominionMenu" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="dominion.game.CreateMenu"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
</activity>
<activity android:name="dominion.game.AdvancedMenu"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
</activity>
<activity android:name="dominion.game.ShuffleResult"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
</activity>
</application>
</manifest>
希望这会有所帮助:-)
【讨论】:
【参考方案2】:我的应用程序上也发生了这种情况,请检查是否在 Orientation 更改或其他内容上创建了活动。它肯定与活动生命周期有关
【讨论】:
【参考方案3】:我的 Nexus One 也遇到过类似的屏幕方向更改问题。也许您遇到了这个记录在案的错误?
http://code.google.com/p/android/issues/detail?id=6191
【讨论】:
【参考方案4】:在您的清单中,在应用程序标签中插入 android:configChanges="keyboardHidden|orientation|screenSize" 以克服由于方向更改而导致的崩溃。这对我的申请有所帮助。
【讨论】:
以上是关于无明显原因的方向更改后应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
ABB示教器触屏无反应,外屏换后还是无反应,电路板上看无明显异常,请问该怎么处理?