Una actividad hereda un contexto. AlertDialog.Builder especifica un argumento de contexto porque puede ser utilizado por CUALQUIER clase que sea una subclase de contexto, incluyendo una actividad, actividad de lista, servicio, ... (Hay una expresión de codificación común detrás de esto: puede obtener más información al respecto leyendo el Ítem I8 (en Interfaces y clases abstractas) en la fantástica Java Eficaz de Joshua Bloch).
getApplicationContext() devuelve el contexto para su aplicación, que es básicamente el mismo que el contexto de sus actividades, y "en su mayoría" es lo que lo está desanimando. Los detalles no están claros, pero este es un problema ampliamente encontrado, y la respuesta típica es usar el contexto que escribirá la alerta en la pantalla. Tenga en cuenta que eso es no el que devuelve getApplicationContext().
Ahora, si eres como yo, puedes decir "pero estoy trabajando en una clase que no hereda de Activity, por eso quiero usar getApplicationContext() para esto en primer lugar - ¡duh!" En realidad, no hablo tan groseramente como eso; p ... el punto es que he estado aquí también. Lo arreglé así: 1) pregúntese: "¿Tengo mi código de UI AlertDialog en una clase que no es de actividad porque quiero compartirlo entre actividades ... o incluso en ListActivities, Servicios, ...?". Si no, hmmm ... ¿realmente tiene llamadas de la IU de AlertDialog en un código que no puede garantizar que tendrá acceso a la IU (y por lo tanto al contexto)? Si es así, reconsidere su diseño.
Suponiendo que desea compartir esta clase en Actividades, ... la respuesta queda clara. Usted quiere que su clase sea utilizable por una variedad de personas que llaman, probablemente cada uno con su propio contexto: por lo que la persona que llama tiene que pasar su contexto en su clase como un argumento:
myClass(Context theContext, ...) { ... }
Cada actividad, servicio, etc. a continuación, hace llamadas de este modo:
myClass(this, ...);
familiar?
¡Ten cuidado! si compartes código, debes considerar la posibilidad de que diferentes llamadas entren en tu código compartido en paralelo, con todas las ramificaciones. Eso está más allá de nuestro alcance aquí ...
Diviértete :)
también es cierto para otros cuadros de diálogo. Buena pregunta, +1 – bigstones
@bigstones Descubrí otro hilo que trata de un problema similar, pero no hay explicación: http://stackoverflow.com/questions/3968170/android-prompt-users-input-using-a-dialog – an00b
Mi suposición es que el Constructor no solo solicita una Actividad porque evitaría que las futuras API tengan otros tipos de contextos que puedan mostrar un diálogo. – bigstones