views:

279

answers:

2

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();
        }
    }
}
+2  A: 

It's really difficult to help you if you don't provide some part of your code... anyway, this error is not new and there are some workarounds in order to solve it (I guess is some bug)... try to do this:

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

This is for overriding the onDetachedFromWindow and I hope it works for you.

Cristian
If you need code, ask for it.
Brad Hein
http://code.google.com/p/android/issues/detail?id=6191
Brad Hein
I tried implementing this fix last night but it had no affect. First off, Eclipse didn't like "protected" so I had to make it public. Also, stopFlipping needed to be qualified using findviewById, etc. And I put debug messages in the new code block and found it wasn't even firing, ever.
Brad Hein
@Brad Could you share your code so that we can see if you are doing something wrong?
Cristian
Just added XML Layout and code snippets.
Brad Hein
Found the problem: Per http://code.google.com/p/android/issues/detail?id=6191 we need to create our own viewflipper wrapper by defining a new class that extends ViewFlipper. Call the new class MyViewFlipper. And anywhere I want to use a viewflipper, such as in layout XML, use the MyViewFlipper class which includes the fix code specified in the link I pasted.
Brad Hein
+2  A: 

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");
        }
    }


}

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:

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

Brad Hein
I think I made a small typo - the <ViewFlipper needs to be <com.gtosoft.dash.MyViewFlipper
Brad Hein