AlertDialog в AndEngine - PullRequest
       10

AlertDialog в AndEngine

0 голосов
/ 25 января 2012

Я пытаюсь показать alerttdialog, но я получаю эту ошибку

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)

Он указывает на эту строку

 @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;
  }       

}

Ответы [ 3 ]

6 голосов
/ 07 апреля 2012

Вызовите showDialog из UIThread.

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

Да и НЕТ, НЕТ, НЕТ, НЕТ, НЕТ, НЕТ, НЕТ, НЕТ:

case 1:
3 голосов
/ 25 января 2012

По какой-то причине метод onCreateDialog вызывается из UpdateThread AndEngine (хотя его следует вызывать из потока пользовательского интерфейса).

Помните, что когда вы показываете диалог, вы звоните showDialog(int id), а не onCreateDialog(int id). После того, как вы позвоните showDialog, Android по возможности вызовет onCreateDialog в потоке пользовательского интерфейса.

На самом деле, я посмотрел в showDialog info сейчас, и он устарел, похоже, что существует совершенно новый способ создания диалогов. Подробнее здесь .

1 голос
/ 25 января 2012

попробуйте

@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;
  }       
}
...