2012-01-25 3 views
0

Je suis en train de montrer une AlertDialog mais je continue à obtenir cette erreurAlertDialog dans AndEngine

01-24 21:52:45.640: E/AndroidRuntime(31119): FATAL EXCEPTION: UpdateThread 
01-24 21:52:45.640: E/AndroidRuntime(31119): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
01-24 21:52:45.640: E/AndroidRuntime(31119): at android.os.Handler.<init>(Handler.java:121) 
01-24 21:52:45.640: E/AndroidRuntime(31119): at android.app.Dialog.<init>(Dialog.java:100) 
01-24 21:52:45.640: E/AndroidRuntime(31119): at android.app.AlertDialog.<init>(AlertDialog.java:96) 
01-24 21:52:45.640: E/AndroidRuntime(31119): at android.app.AlertDialog$Builder.create(AlertDialog.java:891) 

Il pointe vers cette ligne

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case 1: 
     isGameRunning = false; 
     gameStarted = false; 
     mEngine.stop(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("How To Play"); 
     builder.setIcon(R.drawable.ic_launcher); 



     final AlertDialog alert = builder.create(); //this line 

     builder.setPositiveButton("Thanks", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      alert.dismiss(); 
      isGameRunning = true; 
      mEngine.start(); 
      gameStarted = true; 

     } 
     }); 
     return alert; 
    default: 
     return null; 
    }  

}

Répondre

3

Il semble que, pour une raison quelconque, le m ethod onCreateDialog est appelé à partir du UpdateThread d'AndEngine (alors qu'il devrait être appelé depuis le thread UI). N'oubliez pas que lorsque vous affichez une boîte de dialogue, vous appelez showDialog(int id) plutôt que onCreateDialog(int id). Après avoir appelé showDialog, Android appellera onCreateDialog sur le fil de l'interface utilisateur lorsque cela est possible.

En fait, j'ai regardé dans showDialog info maintenant et il est obsolète, il semble qu'il y ait une toute nouvelle façon de créer des boîtes de dialogue. Lire la suite here.

1

essayer cette

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case 1: 
     isGameRunning = false; 
     gameStarted = false; 
     mEngine.stop(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("How To Play") 
       .setIcon(R.drawable.ic_launcher) 
       .setPositiveButton("Thanks", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      isGameRunning = true; 
      mEngine.start(); 
      gameStarted = true; 

     } 
     }); 
     return builder.create(); 
    default: 
     return null; 
    }  
} 
6

Appelez showDialog à partir de l'UIThread.

this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     MyActivity.this.showDialog(MY_DIALOG_ID); 
    } 
}); 

Oh, et NON, NON, NON, NON, NON, NON, NON, NON:

case 1: 
+0

De quelle méthode dois-je appeler ce runOnUiThread() ?? Je veux prendre le nom d'utilisateur comme entrée. J'utilise SimpleBaseGameActivity. J'ai essayé de l'exécuter de onCreateScene() avant le retour; mais mon interface utilisateur se déforme. –

+0

Je veux dire que je l'appelle d'une classe externe avec le contexte de SimpleBaseGameActivity mais en sortie, je reçois juste une partie de mon image d'arrière-plan et elle est Fluctuante et l'autre partie est noire. –