2011-01-28 6 views
17

Estoy desarrollando una ventana emergente para Android, y está funcionando, agregué un EditText y un botón cuando, al ejecutar ADV este trabajo funciona correctamente, mientras se ejecuta en el dispositivo , cuando me enfoco en EditText, arroja una excepción extraña.Excepción al enfocar EditText en una ventana emergente que se ejecuta en el dispositivo

android.view.WindowManager$BadTokenException: Unable to add window - - token android.view.ViewRoot&48163b18 is not valid; is your active running? 

No sé si es importante, pero estoy usando una Galaxy Tab con entrada Swype.

Ahora leo las especificaciones de la Window.showAtLocation

public void showAtLocation (View parent, int gravity, int x, int y) 

Display the content view in a popup window at the specified location. If the popup window cannot fit on screen, it will be clipped. [...] 

Parameters 
parent a parent view to get the getWindowToken() token from 
[...] 

El problema es sólo en esa señal, pero ¿cómo puedo pasar el testigo a la misma actividad?

También escribí un pequeño código para reproducir el error.

PopupWindow window = new PopupWindow(activity); 
window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

window.setTouchable(true); 
window.setFocusable(true); 

EditText text = new EditText(activity); 
text.setText("Dont touch, this crash!"); 

window.setContentView(text); 
window.showAtLocation(arg0, Gravity.NO_GRAVITY, 10,10); 

ejecutan en todos los AVD funciona bien, mientras que el dispositivo de este accidente y tirar el error que he mencionado.

Descubro algo nuevo, cuando estoy en modo apaisado, estos errores no ocurren.

+0

Esto puede ser un tiro total en la oscuridad, pero después de investigar esto un poco, parece que este problema podría estar causado por el uso de Activity.getApplicationContext como el contexto. Este hilo te da una solución, si este es realmente tu problema. http://groups.google.com/group/android-developers/browse_thread/thread/7a648edddccf6f7d?pli=1 –

+1

Intenté incluso con muchos contextos (desde el botón, desde la actividad, la aplicación) el mismo error en todos. –

+0

@Marcos Vasconcelos, tengo el mismo problema contigo, y parece que no es el código, pero el dispositivo causa el bloqueo. y he probado algunas pestañas android de Android samsumg, la mayoría de ellas se bloqueará. Quiero saber si ha resuelto este problema. o qué deberíamos hacer – DiveInto

Respuesta

3

Me trataron de ejecutar su código, pero todo funciona bien para mí ... Esta es la clase de prueba que escribí:

public class TestActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button btn = (Button) findViewById(R.id.testBtn); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       showPopup(); 
      } 
     }); 
    } 


    private void showPopup() 
    { 
     PopupWindow window = new PopupWindow(this); 
     window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); 
     window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); 

     window.setTouchable(true); 
     window.setFocusable(true); 

     EditText text = new EditText(this); 
     text.setText("Touch it, it doesn't crash"); 

     window.setContentView(text); 
     window.showAtLocation(text, Gravity.NO_GRAVITY, 30, 30); 
    } 
} 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <Button 
     android:id="@+id/testBtn" 
     android:text="Popup" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

Tal vez trató de correr el código emergente en la función onCreate()? Si lo hago, arroja la misma Excepción que la tuya, pero es normal ya que cuando se llama a onCreate(), la actividad todavía no se ha inicializado por completo.

(probé en una Galaxy Tab también, pero sin la entrada Swype)

+0

En realidad, llamo eso de un evento, tu código arroja la misma excepción, pero SOLO en el dispositivo, esta es la parte extraña. Ty –

+0

Eso es extraño, no lo entiendo ... para mí funciona tanto en el AVD como en mi Galaxy Tab. – Dalmas

+0

También funciona bien en mi Galaxy S y HTC deseo – Dalmas

0

Editado

tratan como esto crear una nueva clase dicen Popupcls

public class PopUpFlag { 
     private PopupWindow pw; 

    public void initiatePopupWindow(Activity ctx) { 
    LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout = inflater.inflate(R.layout.popupprofile, (ViewGroup) ctx.findViewById(R.id.popup_element)); 
    EditText ettext = (EditText) layout.findViewById(R.id.edit); 
    pw = new PopupWindow(layout, 300, 400, true); 
    pw.showAtLocation(layout, Gravity.BOTTOM, 0, 0); 
    } 

En su actividad si es necesario ventana emergente cuando el botón emergente haga clic en escribir como este

popupbtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       PopUpFlag puf=new PopUpFlag(); 
       puf.initiatePopupWindow(YourActivityName.this); 
      } 
     }); 

Espero que esto ayude s

+0

En realidad, esta línea está fuera de mi clase de actividad, pero la actividad es una referencia. Y probé con un montón de Contextos –

2
EditText text = new EditText(activity); 
text.setText("Dont touch, this crash!"); 

este hecho es la causa de la excepción ..

cuando nos atamos a la EditarTexto a un texto que se cae en el clic cuando aparezca el teclado virtual ..

Pero el mismo código funciona bien cuando no nos atamos a la EditarTexto

EditText text = new EditText(activity); 

Aunque estoy enfrentando el mismo error, y no es capaz de resolver hasta ahora ....

Estamos poniendo esfuerzos aquí para enfocarnos en la línea problemática del creador ...

cualquier organismo puede sugerir por qué itz comportarse tal y cómo solucionar este problema ..

Thankx

0

También me dio el mismo error cuando el EditarTexto en mi popupWindow tenía un poco de texto ya presente y el texto wasn No es una palabra de diccionario (por ejemplo, un nombre de ciudad). ¡Cuando hago clic entre el texto y el boom! Tengo la excepción. Lo resuelto haciendo que el EditarTexto no muestra sugerencias de corrección automática:

android:inputType="textNoSuggestions" 
6

Gracias, TheRedPill! Tuve el mismo problema con EditText dentro de PopupWindow comportándose de manera extraña. Funcionó en Samsung Galaxy S3, HTC One X pero se estrelló en Huawei MediaPad FHD 10. Tan pronto como comencé a editar la aplicación se bloqueó.

Su solución:

editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 

Resuelto el problema para mí.

La pila-trace fue:

08-15 15:49:03.690: ERROR/AndroidRuntime(8692): FATAL EXCEPTION: main 
    android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:585) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
    at android.view.Window$LocalWindowManager.addView(Window.java:547) 
    at android.widget.PopupWindow.invokePopup(PopupWindow.java:988) 
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845) 
    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809) 
    at android.widget.Editor$PinnedPopupWindow.updatePosition(Editor.java:2147) 
    at android.widget.Editor$PinnedPopupWindow.show(Editor.java:2104) 
    at android.widget.Editor$SuggestionsPopupWindow.show(Editor.java:2349) 
    at android.widget.Editor.showSuggestions(Editor.java:1647) 
    at android.widget.Editor$1.run(Editor.java:1546) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4745) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

tu hombre +1 – Sameer

+0

Gracias, guardaste mi código: D – sdelvalle57

+0

esto resolvió mi problema – HendraWD

4

La causa:

que encontrar la causa del error hasta el comportamiento de auto-corrección ortográfica en algunos teléfonos (Moto Droid Razr y pocos otros Moto Phones) y algunos Rom de Android (como algunos ROM ROM CM7 y CM7.1). Si el texto contiene una palabra que tiene un hechizo incorrecto, y el cursor del texto está sobre o cerca del texto, el sistema operativo Android intentará abrir automáticamente el teclado e intentar proporcionar sugerencias sobre la ortografía correcta.

En la mayoría de los dispositivos, el cuadro de sugerencia de corrección automática solo aparece como un segmento de línea sobre el teclado. Sin embargo, en algunas ROM personalizadas (CM7 es una de las que parece que me pasa) y algunos dispositivos (Droid Razr), hay un cuadro de selección desplegable adicional que aparece:

Vea esto image de lo que parece la ventana emergente de autocorrección como (lo siento no suficiente representante para insertar la imagen)

Sospecho que la lista desplegable de autocorrección también se implementa como una ventana emergente, y está tratando de usar la ventana emergente actual (la que contiene EditText con el mis-spell word) como la vista raíz e intentando obtener el windowToken desde la vista raíz.

Dado que la ventana emergente en sí no es una vista tradicional, supongo que no puede dar la ventana WindowToken correcta a las otras vistas que las piden, lo que da lugar al error.

Las Soluciones:

1) La forma más sencilla que sido capaz de solucionar este problema es mediante el uso de diálogo en lugar de ventanas emergentes. Su API es muy similar y en mi caso es bastante fácil reemplazar PopupWindow usando Dialog.

Por ejemplo:

Código antiguo:

LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater(); 
    View mainView = parentActivity.findViewById(R.id.main_calendar_fragment); 
    updateEventPopupWindow = new PopupWindow(inflater.inflate(
      R.layout.add_event_fragment, null, false), metrics.widthPixels, metrics.heightPixels, true); 
    updateEventPopupWindow.setBackgroundDrawable(new BitmapDrawable()); 
    updateEventPopupWindow.showAtLocation(mainView, Gravity.CENTER, 0, 0); 

Nuevo código:

LayoutInflater inflater = (LayoutInflater) parentActivity.getLayoutInflater(); 
    View mainView = parentActivity.findViewById(R.id.main_calendar_fragment);  
    updateEventDialog = new Dialog(parentActivity, android.R.style.Theme_NoTitleBar); 
    updateEventDialog.setContentView(inflater.inflate(R.layout.add_event_fragment, (ViewGroup) mainView, false)); 
    updateEventDialog.show(); 

2) El segundo enfoque es más difícil, pero podría ser un adecuado si PopupWindow a la sustitución de diálogo se no factible, es para usar Fragmentos en lugar de PopupWindows. Hay muchos buenos fragmentos tutorials por ahí, así que no me molestaré en repasar cómo hacer esto en esta publicación.

3) Como último recurso, como múltiples carteles mencionados anteriormente, puede desactivar el texto autocorregido en los campos EditText dentro de PopupWindwow para dar un paso al costado este problema. Sin embargo, esto lleva a experiencias de usuario horribles, ya que muchos usuarios (y teclados como swype) dependen de la corrección automática, ya que esto alejará al usuario de su aplicación.

Espero que esto ayude a otros que enfrentan este problema. Golpeé mi cabeza contra el teclado por más de un día y finalmente decidí probar el enfoque Dialog, lo que para mi sorpresa fue bastante fácil de cambiar. Buena suerte para usted

0

El bloqueo se produce en un EditText colocado en el WindowManager cuando el usuario toca una palabra subrayada como roja. Tal palabra subrayada significa que no existe en el diccionario. En el grifo, el sistema operativo intenta mostrar un pop con las palabras coincidentes más cercanas del diccionario y cuelga, ya que una ventana emergente como esa no se puede adjuntar a la ventana debido a la excepción del token defectuoso.

solamente la siguiente solución parecía funcionar para mí programación

//assume an EditText object with name myEditText 
myEditText.setInputType(myEditText.getInputType() | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 
no parecen funcionar como se espera en todos los teclados mientras que InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD tiene el inconveniente de que también desactiva alternar el idioma

InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS en el teclado y el gesto deslizar para agregar el texto.

Cuestiones relacionadas