为什么键盘滑动崩溃我的应用程序? [英] Why does keyboard-slide crash my app?
问题描述
如果我实际上滑出了我的Moto Droid A855上的键盘,它崩溃了我的测试应用程序与下面粘贴的堆栈跟踪。我不明白为什么?
此外,如果我用键盘启动我的应用程序,我的应用程序在启动时立即崩溃。
应用程序包含一个活动,其中包含一个viewflipper作为主视图布局。 viewflipper包含两个linearlayouts ...
堆栈跟踪:
06-10 21:10:17.652 E / AndroidRuntime(3785):未捕获处理程序:线程主退出由于未捕获异常
06-10 21:10:17.668 E / AndroidRuntime(3785):java.lang.IllegalArgumentException:接收者未注册:android.widget.ViewFlipper$1@447af0b8
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.app.ActivityThread $ PackageInfo.forgetReceiverDispatcher(ActivityThread.java:667)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747)
06-10 21:10:17.668 E / AndroidRuntime :在android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.View.dispatchDetachedFromWindow(View.java:5835)
06-10 21:10:17.668 E / AndroidRuntime 3785):在android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java: 1074)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot。 java:1570)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewRoot.doDie(ViewRoot.java:2556)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.ViewRoot.die(ViewRoot.java:2526)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.WindowManagerImpl.removeViewImmediate WindowManagerImpl.java:218)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.view.Window $ LocalWindowManager.removeViewImmediate(Window.java:436)
06-10 21 :10:17.668 E / AndroidRuntime(3785):在android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.app。 ActivityThread.handleRelaunchActivity(ActivityThread.java:3599)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.app.ActivityThread.access $ 2300(ActivityThread.java:119)
06 -10 21:10:17.668 E / AndroidRuntime(3785):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1867)
06-10 21:10:17.668 E / AndroidRuntime在android.os.Handler.dispatchMessage(Handler.java:99)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.os.Looper.loop(Looper.java:123)
06-10 21:10:17.668 E / AndroidRuntime(3785):在android.app.ActivityThread.main(ActivityThread.java:4363)
06-10 21:10:17.668 E / AndroidRuntime ):在java.lang.reflect.Method.invokeNative(本地方法)
06-10 21:10:17.668 E / AndroidRuntime(3785):在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 dalvik.system.NativeStart.main(本地方法)
06-10 21:10:17.684 I /进程(1017):发送信号。 PID:3785 SIG:3
编辑:添加主要活动的XML布局和相关片段。 >
整个XML布局文件
<?xml version =1.0encoding =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>
<! - 线性布局1:消息和概述。 - >
< LinearLayout
android:orientation =vertical
android:layout_width =fill_parent
android:layout_height =fill_parent
&
< TableRow android:id =@ + id / TableRow01android:layout_width =fill_parentandroid:layout_height =wrap_content>
< TextView
android:text =Connection info
android:id =@ + id / tvCon1
android:layout_width =fill_parent
: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>
<! - 线性布局2:设置 - >
< 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>
主要活动的代码段:
/ **
*尝试(目前不工作)解决此错误:http://code.google.com/p/android/issues/detail?id=6191
* TODO:使它工作。
* /
@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();
}
}
}
要解决此问题,您必须
- 定义一个新类
MyViewFlipper
ViewCFlipper
- 在之前引用的任何地方引用该类
ViewFlipper
- 定义您的类和布局,如下所示:
类 MyViewFlipper
。包含以下内容:
package com.gtosoft.dash; //更改此设置以匹配您自己的应用程序。
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
,如下所示:
< 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>
(在此插入所有其他旧布局代码)
< /com.gtosoft.dash.MyViewFlipper>
现在,应用程序不再在键盘幻灯片事件上崩溃, 。在日志中查找:
06-11 20:08:15.811 D / MyViewFlipper(6106):停止viewflipper崩溃
抵免额: http://code.google.com/p/android/issues/detail?id=6191
If I physically slide out the keyboard on my Moto Droid A855, it crashes my test app with the stack trace pasted below. I don't understand why?
Also, if I start my app with the keyboard out, my app crashes immediately on startup.
The app consists of an activity, which contains a viewflipper as the main view layout. The viewflipper contains two linearlayouts...
Stack trace:
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
EDIT: added XML layout and relevant snippets from main activity.
Entire XML layout file
<?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>
Code snippets from Main Activity:
/**
* 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();
}
}
}
To resolve this issue you must
- Define a new class called
MyViewFlipper
which overridesViewFlipper
(see below) - Reference that new class anywhere you would have previously referenced
ViewFlipper
- Define your class and layout as shown below:
New class called MyViewFlipper
. Contains the following:
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();
}
}
}
Now to use this "fixed" version of ViewFlipper
you have to reference it in the xml layout. Since it is basically a "custom view", you have to fully qualify the package path to MyViewFlipper
, as seen here:
<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>
Now the app no longer crashes on the keyboard slide event or if the app is started with slide already out. Look for this in the log:
06-11 20:08:15.811 D/MyViewFlipper( 6106): Stopped a viewflipper crash
Credit: http://code.google.com/p/android/issues/detail?id=6191
这篇关于为什么键盘滑动崩溃我的应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!