【问题标题】:Why does keyboard-slide crash my app?为什么键盘滑动会使我的应用程序崩溃?
【发布时间】:2010-06-11 01:20:22
【问题描述】:

如果我在 Moto Droid A855 上以物理方式滑出键盘,它会使我的测试应用程序崩溃,并在下面粘贴堆栈跟踪。我不明白为什么?

另外,如果我在不使用键盘的情况下启动我的应用程序,我的应用程序会在启动时立即崩溃。

该应用由一个 Activity 组成,其中包含一个 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 布局和相关的 sn-ps。

整个 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>

Main Activity 中的代码 sn-ps:

/**
 * 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();
        }
    }
}

【问题讨论】:

    标签: android crash viewflipper


    【解决方案1】:

    要解决此问题,您必须

    • 定义一个名为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,如下所示:

    <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

    【讨论】:

    • 我想我犯了一个小错误 -
    • 您遗漏了重要的一行:在 catch 块中调用 stopFlipping() 以便它会调用 updateRunning()。
    【解决方案2】:

    如果您不提供代码的某些部分,真的很难帮助您......无论如何,这个错误并不是新的,并且有一些解决方法可以解决它(我猜是一些错误)......尝试这样做:

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

    这是为了覆盖onDetachedFromWindow,我希望它对你有用。

    【讨论】:

    • 我昨晚尝试实施此修复,但没有任何影响。首先,Eclipse 不喜欢“受保护”,所以我不得不将其公开。此外,stopFlipping 需要使用 findviewById 等进行限定。我将调试消息放入新代码块中,发现它甚至没有触发过。
    • @Brad 您能否分享您的代码,以便我们查看您是否做错了什么?
    • 发现问题:根据code.google.com/p/android/issues/detail?id=6191,我们需要通过定义一个扩展 ViewFlipper 的新类来创建自己的 viewflipper 包装器。调用新类 MyViewFlipper。在我想使用 viewflipper 的任何地方,例如在布局 XML 中,使用 MyViewFlipper 类,其中包括我粘贴的链接中指定的修复代码。
    【解决方案3】:

    我知道这个问题是在大约两年前被问到的,但从那时起就实施了一个非常简单的解决方案。只需将android:configChanges="orientation|keyboard|keyboardHidden" 添加到 Manifest 中的每个 Activity 调用中即可。

    【讨论】:

      【解决方案4】:

      是的,我之前没有看到这个错误.. 但是我的清单中有这个错误

       <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>
      

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2021-11-10
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        相关资源
        最近更新 更多