为什么键盘滑盖崩溃我的应用程序? [英] Why does keyboard-slide crash my app?

查看:130
本文介绍了为什么键盘滑盖崩溃我的应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我身体滑出键盘上我的摩托罗拉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(3785):在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(3785):在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(3785):在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):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
06-10 21:10:17.668 E / AndroidRuntime(3785):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-10 21:10:17.668 E / AndroidRuntime(3785):在dalvik.system.NativeStart.main(本机方法)
06-10 21:10:17.684的I /过程(1017):发送信号。 PID:3785 SIG:3
 

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

整个XML布局文件

 < XML版本=1.0编码=UTF-8&GT?;


< ViewFlipper
        的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
        机器人:ID =@ + ID / vFlipper
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT>

                <  - 线性布局1:信息和概述。 - >
                <的LinearLayout
                    机器人:方向=垂直
                    机器人:layout_width =FILL_PARENT
                    机器人:layout_height =FILL_PARENT
                    >

                <的TableRow机器人:ID =@ + ID / TableRow01机器人:layout_width =FILL_PARENT机器人:layout_height =WRAP_CONTENT>
                <的TextView
                        机器人:文本=连接信息
                        机器人:ID =@ + ID / tvCon1
                        机器人:layout_width =FILL_PARENT
                        机器人:layout_height =WRAP_CONTENT
                        机器人:后台=#F0F0F0
                        机器人:文字颜色=#FF0000
                        />
                < /的TableRow>


                <滚动型
                        机器人:ID =@ + ID / ScrollView01
                        机器人:layout_width =FILL_PARENT
                        机器人:layout_height =FILL_PARENT>

                                <的TextView
                                        机器人:ID =@ + ID / tvMessages
                                    机器人:layout_width =FILL_PARENT
                                    机器人:layout_height =FILL_PARENT
                                    机器人:文本=
                                    />

                < /滚动型>

        < / LinearLayout中>


        <  - 线性布局2:设置 - >
        <的LinearLayout
                    机器人:方向=垂直
                    机器人:layout_width =FILL_PARENT
                    机器人:layout_height =FILL_PARENT
                    >


                <的TableRow
                        机器人:ID =@ + ID / TableRow03
                        机器人:layout_width =FILL_PARENT
                        机器人:layout_height =WRAP_CONTENT>

                                <的TextView
                                机器人:文字=世界你好
                                机器人:ID =@ + ID / asdfasdf2
                                机器人:layout_width =FILL_PARENT
                                机器人:layout_height =WRAP_CONTENT
                                />
                < /的TableRow>

        < / LinearLayout中>

< / ViewFlipper>
 

这主要活动code片段:

  / **
 *尝试(目前没有工作),以解决此bug:HTTP://$c$c.google.com/p/android/issues/detail ID = 6191
 * TODO:使其发挥作用。
 * /
@覆盖
公共无效onDetachedFromWindow(){
        Log.d(短跑,OnDetachedFromWindow());

        尝试 {
        super.onDetachedFromWindow();
    }
    赶上(例外五){
        ViewFlipper V =(ViewFlipper)findViewById(R.id.vFlipper);
        如果(V!= NULL){
                Log.d(短跑,德臭虫按E =+ e.getMessage());
                v.stopFlipping();
        }
    }
}
 

解决方案

要解决此问题,您必须

  • 定义一个新类 MyViewFlipper 将覆盖 ViewFlipper (见下文)
  • 在参考了新一类的任何地方,你将有previously引用 ViewFlipper
  • 定义类和布局,如下所示:

新类 MyViewFlipper 。包含以下内容:

 包com.gtosoft.dash; //改变这种以匹配自己的应用程序。

进口android.content.Context;
进口android.util.AttributeSet;
进口android.util.Log;
进口android.widget.ViewFlipper;

公共类MyViewFlipper扩展ViewFlipper {

    公共MyViewFlipper(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
    }

    @覆盖
    保护无效onDetachedFromWindow(){
        尝试{
            super.onDetachedFromWindow();
        }赶上(例外五){
            Log.d(MyViewFlipper,停了viewflipper死机);
            stopFlipping();
        }
    }
}
 

现在你必须引用它在XML布局使用固定版本 ViewFlipper 的。由于它基本上是一个自定义视图,你必须完全限定包路径为 MyViewFlipper ,因为在这里看到:

 < com.gtosoft.dash.MyViewFlipper
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / vFlipper
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT>

    (插入所有其他的老布局code在这里)

< /com.gtosoft.dash.MyViewFlipper>
 

现在应用程序不再在键盘上滑动时崩溃或者应用程序启动采用滑盖已经出来了。寻找这在日志中:

  06-11 20:08:15.811 D / MyViewFlipper(6106):停了viewflipper崩溃
 

贷:<一href="http://$c$c.google.com/p/android/issues/detail?id=6191">http://$c$c.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 overrides ViewFlipper (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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆