Деятельность наследует контекст. AlertDialog.Builder задает аргумент Context, потому что он может затем использоваться классом ANY, который является подклассом Context, включая Activity, ListActivity, Service, ... (за этим стоит общая идиотская кодировка - вы можете узнать больше об этом прочитав пункт I8 (на интерфейсах и абстрактных классах) в фантастической Эффективной Java Джошуа Блоха).
getApplicationContext() возвращает контекст для вашего приложения, которое в основном совпадает с контекстом вашей деятельности - и в основном это то, что вас отбрасывает. Детали неясны, но это широко распространенная проблема, и типичным ответом является использование контекста, который будет писать предупреждение на экран. Обратите внимание, что это не тот, который возвращается getApplicationContext().
Теперь, если вы похожи на меня, вы можете сказать «но я работаю в классе, который не наследует от Activity», поэтому я хочу использовать getApplicationContext() для этого, в первую очередь - duh! » Я на самом деле не говорю так грубо, как это, потому что я был здесь. Я исправил его так: 1) спросите себя: «У меня есть код UI AlertDialog в классе без активности, потому что я хочу поделиться им по всем видам деятельности .. или даже через ListActivities, Services, ...?». Если нет, хм ... у вас действительно есть вызовы пользовательского интерфейса AlertDialog в коде, который вы не можете гарантировать, будет иметь доступ к пользовательскому интерфейсу (и, следовательно, к контексту)? Если это так, пересмотреть свой дизайн.
Предполагая, что вы хотите поделиться этим классом через Деятельность, ... ответ становится ясным. Вы хотите, чтобы ваш класс, который будет использоваться различными абонентами, каждый, вероятно, со своим собственным контекстом: поэтому вызывающий абонент должен передать свой контекст в свой класс в качестве аргумента:
myClass(Context theContext, ...) { ... }
Каждый вид деятельности, услуг и т.д. затем делает звонки, как так:
myClass(this, ...);
Посмотрите знакомые?
Будьте осторожны! что если вы используете общий код, вы должны учитывать возможность одновременного вызова разных вызовов в ваш общий код со всеми многочисленными последствиями. То, что выше наших возможностей здесь ...
Удачи :)
Это также верно для других диалогов. Хороший вопрос, +1 – bigstones
@bigstones Я открыл еще один поток, посвященный аналогичной проблеме, но не объяснил: http://stackoverflow.com/questions/3968170/android-prompt-users-input-using-a-dialog – an00b
Мое предположение что Builder не просто запрашивает действие, потому что это предотвратит появление в будущем API других контекстов, которые могут отображать диалог. – bigstones