2010-04-28 3 views
1

Я хочу создать нормальный AlertDialog. Я использовал пример, предоставленный документами android dev. Я только что изменил DIALOG_PAUSED_ID на DIALOG_DELETEDB. Если я выполнить свой код и нажать на кнопку, которая в свою очередь должна создать диалог, я получаю следующее журнал ошибок:AlerDialog не создан - java.lang.IllegalArgumentException: Activity # onCreateDialog не создавал диалог для id X

04-29 01:01:20.973: WARN/dalvikvm(1168): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
04-29 01:01:20.973: ERROR/AndroidRuntime(1168): Uncaught handler: thread main exiting due to uncaught exception 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168): java.lang.IllegalArgumentException: Activity#onCreateDialog did not create a dialog for id 4 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.app.Activity.createDialog(Activity.java:871) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.app.Activity.showDialog(Activity.java:2483) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at mjb.project.AVV.Favs.onMenuItemSelected(Favs.java:111) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:525) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.view.View.onTouchEvent(View.java:4179) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.widget.TextView.onTouchEvent(TextView.java:6540) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.view.View.dispatchTouchEvent(View.java:3709) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.os.Looper.loop(Looper.java:123) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-29 01:01:20.993: ERROR/AndroidRuntime(1168):  at dalvik.system.NativeStart.main(Native Method) 

так вот «соответствующие» части кода:

определяют идентификатор:

private static final int DELETE_DB_ID = 3; 
private Dialog dialog; 
static final int DIALOG_DELETEDB = 4; 

onCreateDialog (...):

protected Dialog onCreateDialog(int id) { 
     switch(id) { 
     case DIALOG_DELETEDB: 
      // do the work to define the pause Dialog 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Are you sure you want to exit?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Favs.this.finish(); 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
      break; 
     default: 
      dialog = null; 
     } 


return dialog; 
    } 

Здесь я пытаюсь «создать» диалог:

@Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
     case ADD_ID: 
      createNote(); 
      return true; 
     case DELETE_DB_ID: 
      showDialog(DIALOG_DELETEDB); 
      return true; 
     }  
     return super.onMenuItemSelected(featureId, item); 
    } 

Как я уже сказал, я просто скопировал код и изменил название. К сожалению, я не понимаю сообщение с сообщением об ошибке ..:/Как-то я думаю, что я не возвращаю созданный диалог, но я не вижу «где» моя ссылка или где/что мне нужно вернуть ...

Заранее благодарим за помощь.

ответ

5
  1. Нельзя вызывать alert.show() в onCreateDialog.
  2. Ваш onCreateDIalog возвращает диалоговую переменную, которая на самом деле является нулевой, вы не инициализируете ее.

Пожалуйста, взгляните на образцы \ ApiDemos \ src \ com \ example \ android \ apis \ app \ AlertDialogSamples.java, там все сделано правильно. Вы также можете прочитать это http://developer.android.com/guide/topics/ui/dialogs.html по правильному использованию использования WithCreateDialog. Вот исправленная версия вашего onCreateDialog:

protected Dialog onCreateDialog(int id) { 
     switch(id) { 
     case DIALOG_DELETEDB: 
      // do the work to define the pause Dialog 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Are you sure you want to exit?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Favs.this.finish(); 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      return alert; 
     } 

return null; 
    } 

Другой подход заключается в отображении диалогового непосредственно:

public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     switch(item.getItemId()) { 
     case DELETE_DB_ID: 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Are you sure you want to exit?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Favs.this.finish(); 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
      return true; 
     }  
     return super.onMenuItemSelected(featureId, item); 
    } 
+0

weird .. Я попробовал «вернуть предупреждение», но, возможно, я тоже изменил что-то еще, поэтому у меня что-то не так. тем не менее, большое спасибо, это работает! :-) Кстати. Я прочитал ссылку, которую вы предоставили несколько раз .., вот где я получил свой код .. может быть, я просто устал .... исправил это -> кровать :-) – MJB

0

Не забудьте сначала импортировать android.app.AlertDialog.

AlertDialog alert = new AlertDialog.Builder(this).create(); 
      alert.setTitle("Error"); 
      alert.setMessage("Sorry, your device doesn't support flash light!"); 
      alert.setButton(Dialog.BUTTON_POSITIVE,"OK",new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
       } 
      }); 

alert.show(); 

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

  • Нет связанных вопросов^_^