2010-12-30 4 views
1

У меня возникла проблема с созданием настраиваемого диалога. Но я не нахожу неудачу. Надеюсь, кто-нибудь может мне помочь ...Проблема с созданием настраиваемого диалогового окна

protected Dialog onCreateDialog(int id) { 
    Dialog dialog = null; 
    switch (id) { 
    case DIALOG_ABOUT_ID: 
     dialog = buildAboutDialog(); 
     break; 
    default: 
     dialog = null; 
    } 
    return dialog; 
} 

...

public Dialog buildAboutDialog() { 
    Context mContext = getApplicationContext(); 
    Dialog dialog = new Dialog(mContext); 

    dialog.setContentView(R.layout.about_dialog); 
    dialog.setTitle("About this application"); 

    return dialog; 
} 

Результаты в следующей ошибки:

12-30 19:27:02.593: ERROR/AndroidRuntime(383): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

я проверил, если возвращаемый диалог == NULL - но нет.

Я также попробовал второй путь (Inflater), описанный в http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog

ответ

3

я узнал, что диалог должен быть создан с

Dialog dialog = new Dialog(this); 

и не

Context mContext = getApplicationContext(); 
Dialog dialog = new Dialog(mContext); 

Я доном точно знать почему. Может быть, кто-нибудь может объяснить это мне?

+3

Потому что Диалог должен быть привязан к Управлению, а не к Приложению. – rf43

+0

Что делать, если я хочу показать диалог после щелчка по кнопке? «this» относится к OnClickListener, а не к активности ... – ffleandro

+0

К сожалению, код google для этого при создании настраиваемого диалога имеет getApplicationContext, а не этот ... http: //developer.android.com/guide/topics/ui /dialogs.html#CustomDialog – JPM

1

Диалог диалога = новый диалог (контекс); dialog.setContentView (R.layout.help_content);

это работает для меня .. может быть getapplicationcontext не получить контекст вашего основного класса.

0

Как выясняется, контекст действия отличается от объекта, возвращаемого getApplicationContext(). Это можно проверить, используя журнал, просто выведите ActivityName.this и getApplicationContext.

Объект, возвращаемый getApplicationContext, является глобальной вещью, в то время как контекст активности, ну, принадлежит только этой деятельности.

Log.e(tag,""+ getApplicationContext()); 
Log.e(tag,""+CustomDialogActivity.this); 

где CustomDialogActivity - это моя деятельность, в которой я хочу показать свой диалог.

Диалоги требуют контекста активности, а getApplicationContext() не предоставляет этого. Как написано here (прочитайте комментарии), контекст действия - это надмножество getApplicationContext(). так что хорошо всегда передавать контекст активности, а не глобального контекста.

Также, чтобы ответить на комментарий ffleandro на этой странице, если вы находитесь внутри onClick(), вы можете использовать ActivityName.this для ссылки на активность. Надеюсь, это поможет

Смежные вопросы