2010-06-11 21 views
9

Si deslizo físicamente el teclado de mi Moto Droid A855, se bloquea mi aplicación de prueba con el seguimiento de pila pegado a continuación. No entiendo por qué?¿Por qué la diapositiva del teclado bloquea mi aplicación?

Además, si inicio mi aplicación con el teclado apagado, mi aplicación se bloquea inmediatamente al inicio.

La aplicación consiste en una actividad, que contiene un viewflipper como el diseño de la vista principal. El viewflipper contiene dos linearlayouts ...

Seguimiento de la pila:

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: [email protected] 
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: añadido de diseño XML y fragmentos relevantes de la actividad principal.

archivo de diseño XML completo

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

Los fragmentos de código de actividad principal:

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

Respuesta

21

Para resolver este problema debe

  • Definir una nueva clase llamada MyViewFlipper que anula ViewFlipper (véase más adelante)
  • de referencia que la nueva clase en cualquier lugar que hubiera referenciado anteriormente ViewFlipper
  • Definir su clase y diseño como se muestra a continuación:

Nueva clase llamada MyViewFlipper. Contiene lo siguiente:

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

Ahora utilizar esta versión "fijo" de ViewFlipper que tiene que hacer referencia a ella en el diseño xml. Dado que es básicamente una "vista personalizada", usted tiene que calificar totalmente la ruta del paquete de MyViewFlipper, como se ve aquí:

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

Ahora la aplicación ya no se bloquea en el caso de diapositivas teclado o si la aplicación se inicia con deslizarse ya afuera. Busque este en el registro:

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

Crédito: http://code.google.com/p/android/issues/detail?id=6191

+0

Creo que cometí un pequeño error tipográfico:

+0

Falta una línea importante: llamar a stopFlipping() en el bloque catch para que llame a updateRunning(). –

5

Es muy difícil para ayudarle si usted no proporciona una parte de su código ... de todos modos, este error no es nuevo y hay algunas soluciones para resolverlo (supongo que es un error) ... intente hacer esto:

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

Esto es para anular el onDetachedFromWindow y espero que funcione para usted.

+0

Si necesita un código, solicítelo. –

+0

http://code.google.com/p/android/issues/detail?id=6191 –

+0

Intenté implementar esta revisión anoche pero no tuvo ningún efecto. En primer lugar, a Eclipse no le gustaba "protegido", así que tuve que hacerlo público. Además, stopFlipping necesitaba ser calificado usando findviewById, etc. Y puse mensajes de depuración en el nuevo bloque de código y encontré que ni siquiera estaba disparando. –

2

Sé que esta pregunta se hizo hace casi dos años, pero desde entonces una solución muy fácil ha sido implementado. Simplemente agregue android:configChanges="orientation|keyboard|keyboardHidden" en cada llamada de Actividad en el Manifiesto.

0

sí, yo no veo este error antes ..pero, de nuevo, tengo esto en mi manifiesto

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