为什么键盘滑动崩溃我的应用程序?

如果我身体滑出我的Moto Droid A855键盘,它会崩溃我的testing应用程序粘贴下面的堆栈跟踪。 我不明白为什么?

另外,如果我用键盘启动我的应用程序,我的应用程序在启动时立即崩溃。

该应用程序包含一个活动,其中包含一个viewflipper作为主视图布局。 viewflipper包含两个线性布局…

堆栈跟踪:

06-10 21:10:17.652 E/AndroidRuntime( 3785): Uncaught handler: thread main exiting due to uncaught exception 06-10 21:10:17.668 E/AndroidRuntime( 3785): java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@447af0b8 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:667) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.View.dispatchDetachedFromWindow(View.java:5835) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewRoot.doDie(ViewRoot.java:2556) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.ViewRoot.die(ViewRoot.java:2526) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread.access$2300(ActivityThread.java:119) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1867) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.os.Handler.dispatchMessage(Handler.java:99) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.os.Looper.loop(Looper.java:123) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at android.app.ActivityThread.main(ActivityThread.java:4363) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at java.lang.reflect.Method.invokeNative(Native Method) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at java.lang.reflect.Method.invoke(Method.java:521) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 06-10 21:10:17.668 E/AndroidRuntime( 3785): at dalvik.system.NativeStart.main(Native Method) 06-10 21:10:17.684 I/Process ( 1017): Sending signal. PID: 3785 SIG: 3 

编辑:添加XML布局和主要活动相关的片段。

整个XML布局文件

 <?xml version="1.0" encoding="utf-8"?> <ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/vFlipper" android:layout_width="wrap_content" android:layout_height="wrap_content"> <!-- Linear Layout 1: messages and overview. --> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow android:id="@+id/TableRow01" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="Connection info" android:id="@+id/tvCon1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#F0F0F0" android:textColor="#FF0000" /> </TableRow> <ScrollView android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/tvMessages" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="" /> </ScrollView> </LinearLayout> <!-- Linear Layout 2: settings --> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow android:id="@+id/TableRow03" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="hello world" android:id="@+id/asdfasdf2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </TableRow> </LinearLayout> </ViewFlipper> 

来自主要活动的代码片段:

 /** * Attempt (not currently working) to work around this bug: http://code.google.com/p/android/issues/detail?id=6191 * TODO: make it work. */ @Override public void onDetachedFromWindow() { Log.d("Dash","OnDetachedFromWindow()"); try { super.onDetachedFromWindow(); } catch (Exception e) { ViewFlipper v = (ViewFlipper)findViewById(R.id.vFlipper); if (v != null) { Log.d("Dash","De-Bug hit. e=" + e.getMessage()); v.stopFlipping(); } } } 

Solutions Collecting From Web of "为什么键盘滑动崩溃我的应用程序?"

要解决此问题,您必须

  • 定义一个名为MyViewFlipper的新类,它覆盖了ViewFlipper (见下面)
  • 引用那个你以前引用过ViewFlipper新类
  • 定义你的类和布局,如下所示:

新类叫MyViewFlipper 。 包含以下内容:

 package com.gtosoft.dash; // change this to match your own app. import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.widget.ViewFlipper; public class MyViewFlipper extends ViewFlipper { public MyViewFlipper(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDetachedFromWindow() { try{ super.onDetachedFromWindow(); }catch(Exception e) { Log.d("MyViewFlipper","Stopped a viewflipper crash"); stopFlipping(); } } } 

现在要使用这个“固定”版本的ViewFlipper你必须在xml布局中引用它。 由于它基本上是一个“自定义视图”,因此您必须完全限定到MyViewFlipper的包path,如下所示:

 <com.gtosoft.dash.MyViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/vFlipper" android:layout_width="wrap_content" android:layout_height="wrap_content"> (insert all the other old layout code here) </com.gtosoft.dash.MyViewFlipper> 

现在,应用程序不再在键盘滑动事件上崩溃,或者如果应用程序已经开始幻灯片已经出来。 在日志中查找这个:

 06-11 20:08:15.811 D/MyViewFlipper( 6106): Stopped a viewflipper crash 

信用度: http : //code.google.com/p/android/issues/detail?id=6191

如果你不提供你的代码的一部分真的很难帮助你…无论如何,这个错误不是新的,有一些解决方法,以解决它(我想是一些错误)…试图做这个:

 @Override protected void onDetachedFromWindow() { try { super.onDetachedFromWindow(); } catch (IllegalArgumentException e) { stopFlipping(); } } 

这是重写onDetachedFromWindow ,我希望它适合你。

我知道这个问题在两年前就已经被问到了,但从那以后,一个非常简单的解决scheme就已经实现了。 只需在Manifest中的每个Activity调用中添加android:configChanges="orientation|keyboard|keyboardHidden"

是的,我没有看到这个bug之前..但是,然后我再次在我的清单

  <activity android:name=".MainActivity" android:configChanges="keyboardHidden|navigation" android:label="@string/app_name" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>