Pregunta

Me parece que no puede entender por qué esto está ocurriendo.Este código:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

funciona igual de bien.Sin embargo, este código:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

lanza la siguiente excepción:

W/WindowManager(  569): Attempted to add window with non-application token WindowToken{438bee58 token=null}.  Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049):    at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049):    at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049):    ... 11 more

Alguna idea de por qué está pasando esto?Voy a llamar a esta de la onCreate método.

¿Fue útil?

Solución

¿Qué versión está usando API? Si estoy en lo cierto acerca de cuál es el problema entonces este se fijó en Android 1.6 (API versión 4).

Parece que la referencia al objeto que está regresando getApplicationContext() simplemente apunta a null. Creo que está teniendo un problema similar al que tuve en que parte del código en el onCreate() se ejecuta antes de que la ventana se hace realmente que se está construyendo. Esto va a ser un truco, pero trata de poner en marcha un nuevo hilo en unos pocos cientos de milisegundos (IIRC: 300-400 parecía funcionar para mí, pero usted tendrá que retocar) que abre su ProgressDialog y comienza a cualquier otra cosa que sea necesario ( por ejemplo. red IO). Algo como esto:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}

Otros consejos

Estoy utilizando la versión de Android 2.1 con la API de nivel 7. Frente a esta (o similar) y el problema resuelto mediante el uso de lo siguiente:

Dialog dialog = new Dialog(this);

en lugar de esto:

Dialog dialog = new Dialog(getApplicationContext());

Espero que esto ayude:)

Para mí trabajé cambiar

builder = new AlertDialog.Builder(getApplicationContext());

a

builder = new AlertDialog.Builder(ThisActivityClassName.this);

Lo extraño es que el primero se puede encontrar en google tutorial y la gente consigue error en esta ..

No creo que esto es un problema de tiempo en torno a un contexto de aplicación nula

Trate de solicitud que se extiende dentro de su aplicación (o simplemente usarlo si ya tiene)

public class MyApp extends Application

Hacer la instancia disponible como un producto único privado. Este es no nula

private static MyApp appInstance;

Hacer un ayudante estática en MiApl (que utilizará el singleton)

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

BOOM !!

Además, echa un vistazo a la respuesta del ingeniero de Android aquí: WindowManager $ BadTokenException

  

Una de las causas de este error puede estar tratando de mostrar una aplicación   ventana / de diálogo a través de un contexto que no es una actividad.

Ahora, estoy de acuerdo, no tiene sentido que el método toma un parámetro de contexto, en lugar de la actividad ..

Después de leer las respuestas anteriores he encontrado que para mi situación lo siguiente ha solucionado el problema.

Esto arrojó el error

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(getApplicationContext());
        dialog.show();              
    }
});

Sobre la base de las respuestas anteriores que sugerían que el contexto era el equivocado, he cambiado el getApplicationContext () para recuperar el contexto de la vista en el pasado a los botones método onClick.

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(v.getContext());
        dialog.show();              
    }
});

No entiendo completamente el funcionamiento de Java por lo que podía estar equivocado, pero supongo que por mi situación específica la causa podría estar relacionada con el hecho de que el fragmento anterior se definió en una tipo de actividad abstracta; heredada y utilizado por muchas actividades, quizás que contribuyó al hecho de que getApplicationContext () no devuelve un contexto válido ?? (Solo una suposición).

Estoy creando una vista de mapa con superposiciones detalladas. Yo estaba creando mi itemizedoverlay como esto de mi mapActivity:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

Me pareció que iba a obtener el "android.view.WindowManager $ BadTokenException: No se puede agregar ventana - nula ficha no es para una aplicación" excepción cuando se activa el método Ontap de mi itemizedoverlay (cuando la ubicación se dio un golpecito en el MapView ).

He descubierto que si me pasa simplemente, 'esto' en lugar de 'getApplicationContext ()' a mi constructor, el problema desapareció. Esto parece apoyar la conclusión de alienjazzcat. raro.

Para actividades mostradas en TabActivities utilizan getParent ()

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

en lugar de

final AlertDialog.Builder builder = new AlertDialog.Builder(this);

Para Android 2.2
Utilizar este código:

//activity is an instance of a class which extends android.app.Activity
Dialog dialog = new Dialog(activity);

en lugar de este código:

// this code produces an ERROR:
//android.view.WindowManager$BadTokenException: 
//Unable to add window -- token null is not for an application
Context mContext = activity.getApplicationContext();
Dialog dialog = new Dialog(mContext);

Observación:. Mi diálogo personalizado se crea fuera método activity.onCreateDialog(int dialogId)

Trate -

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

tenido un problema similar con fragmentos (compatibilidad) en los que el uso de un getActivity() dentro ProgressDialog.show() se estrella. Estoy de acuerdo que es debido tiempo.

Una posible solución:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

en lugar de utilizar

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

Coloque el mContext tan pronto como sea posible para darle más tiempo para agarrar el contexto. Todavía no hay ninguna garantía de que esto va a funcionar, sólo se reduce la probabilidad de un accidente. Si aún así no funciona, habría que recurrir al truco temporizador (que puede causar otros problemas de tiempo como se desestima el diálogo más adelante).

Por supuesto, si se puede usar o this ActivityName.this, es más estable porque this ya apunta a algo. Sin embargo, en algunos casos, como con ciertas arquitecturas Fragmento, no es una opción.

(Para futuras referencias)

Creo que es porque hay diferencias en el contexto de aplicación y contexto de actividad, como se explica aquí: http: //www.doubleencore.com/2013/06/context/

Lo que significa que no podemos mostrar de diálogo usando contexto de aplicación. Eso es todo.

Para poder utilizar los cuadros de diálogo dentro de las actividades, hacerlo de esta manera:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     mContext = this;

     //using mContext here refering to activity context
     mBuilder = new AlertDialog.Builder(mContext);
     //...
     //rest of the code
     //...
}

Para poder utilizar cuadros de diálogo en el interior de los fragmentos, hacerlo de esta manera:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View mRootView = inflater.inflate(R.layout.fragment_layout, container, false);
      mContext = getActivity();

      //using mContext here refering to fragment's hosting activity context
      mBuilder = new AlertDialog.Builder(mContext);
      //...
      //rest of the code
      //...
      return mRootView;
}

Eso es todo ^ _ ^

Lo que hice de evitar esto era crear una clase base para todas mis actividades en el que almacenar los datos globales. En la primera actividad, ahorré el contexto de una variable en mi clase base, así:

Clase Base

public static Context myucontext; 

Primera actividad derivada de la clase base

mycontext = this

Luego uso myContext en lugar de getApplicationContext al crear cuadros de diálogo.

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();

Si llama ProgressDialog.show () en un fragmento, echando la mContext de Actividad trabajó para mí.

     ProgressDialog pd = new ProgressDialog((Activity) mContext);

He implementado de Diálogo de Alerta de excepción tirar a la corriente activitty vista.Siempre me había dado como este

AlertDialog.Builder builder = new AlertDialog.Builder(context);

La misma Ventana de Excepción.Puedo escribir el código de alerta de onCreate().Tan simple que he usado context = this; después de setContentView() declaración en onCreate() método.Tomado contexto variable como global como Context context;

Ejemplo de código es

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

Alerta Método de Muestreo es

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

Funciona muy bien para mí.En realidad he buscado este error en StackOverflow me encontré con esta consulta.Después de leer todas las respuestas de este post, he intentado de esta manera funciona .Yo pensé que esta es una solución sencilla para superar la excepción.

Gracias, Rajendar

Si usted tiene un problema en groupActivity no uso esto. PADRES es una estática del ActivityGroup Padres.

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

en lugar de

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

Una de diálogo siempre se crea y se muestra como una parte de una actividad. Tiene que pasar en un contexto de actividad en lugar del contexto de aplicación.

http://developer.android.com/guide/topics/ ui / dialogs.html # ShowingADialog

Este es un problema común. Utilice this en lugar de getApplicationContext() Esto debería resolver su problema

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top