диалог оповещения не отменяется - PullRequest
0 голосов
/ 22 декабря 2011

Я занимаюсь разработкой игры. Если пользователь нажимает кнопку возврата устройства во время приостановки игрового потока, и на экране появляется диалоговое окно с предупреждением. Если пользователь не хочет выходить из игры, игровой поток должен быть возобновлен идиалоговое окно с предупреждением должно исчезнуть ... но проблема в том, что я могу возобновить игровую нить, но не могу отменить диалоговое окно с предупреждением. Ниже приведен фрагмент кода моей кнопки возврата.

    public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {

        MainGamePanel.thread.setRunning(false);

         AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Exit Alert");
          //  alertDialog.setIcon(R.drawable.appicon);

            alertDialog.setMessage("Do you really want to exit the Game?");
            alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                 finish();
                 return;
            } }); 
            alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {


                    if(mainscreenOn)
                    {
                         dialog.cancel();
                    }
                    else
                    { 
                        dialog.cancel();
                        GamePanel.thread.setRunning(true);
                         GamePanel.thread.run();
                    }


                return;
            }}); 
             alertDialog.show();

         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

, если флаг mainscreenOn имеет значение true, тогда предупреждениедиалоговое окно отменяется ... но проблема возникает, если оно ложное. Может кто-нибудь помочь мне, пожалуйста ... я застрял на этом ...

я узнал, что это не проблема диалогового окна предупреждения... это проблема моего игрового потока ... ниже приведен мой код игрового потока ..

    public class GameThread extends Thread {

private static final String TAG = GameThread.class.getSimpleName();

// Surface holder that can access the physical surface
private SurfaceHolder surfaceHolder;
// The actual view that handles inputs
// and draws to the surface
private MainGamePanel gamePanel;


// flag to hold game state 
public boolean running;
public void setRunning(boolean running) {
    this.running = running;
}

public GameThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) {
    super();
    this.surfaceHolder = surfaceHolder;
    this.gamePanel = gamePanel;
}



@Override
public void run() {
    Canvas canvas;
    Log.d(TAG, "Starting game loop");

    while (running) {

        Log.v(""," ->Inside Thread!" + running);
        canvas = null;
        // try locking the canvas for exclusive pixel editing
        // in the surface
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                // update game state 
                this.gamePanel.update();
                // render state to the screen
                // draws the canvas on the panel
                this.gamePanel.render(canvas);  

                }
        } finally {
            // in case of an exception the surface is not left in 
            // an inconsistent state
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }   // end finally
    }
}



 }

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

Ответы [ 3 ]

0 голосов
/ 22 декабря 2011

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

alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                         dialog.dismiss();
                        if(!mainscreenOn)
                        {
                             GamePanel.thread.setRunning(true);
                             GamePanel.thread.run();
                        }


                    return;
                }}); 

Отредактировано:

Затем попробуйте с помощью кнопки «Позитив» и «Кнопка негатива». Если это не сработает, проверьте пункт, упомянутый «Югандхар Бабу».

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) {
                                finish();
                           }
                       })
                       .setNegativeButton("No", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                           }
                       });
                AlertDialog alert = builder.create();
                alert.show();
0 голосов
/ 22 декабря 2011

Я проверил ваш код без GamePanel операторов, он отлично работает как для mainscreenOn, так и для true и flase .

Я думаю, что в вашем случае он не возвращается с onClick(), когда mainScreenOn имеет значение false , означает, что он имеет значение GamePanel.thread.setRunning() или GanePanel.thread.run().


Проверьте эту ссылку, она может вам помочь. о паузе и возобновлении темы.

Как приостановить / возобновить поток в Android


Вы звоните run() после setRunning(true). Я думаю, что если ваш поток имеет Runnable объект, то только вы должны вызвать run(). как показано ниже

Thread t = new Thread(new Runnable() {
      public void run() {
          // your task
      }
});

Если вы не используете Runnable объект, я думаю, нет необходимости вызывать run(). В любом случае вы управляете потоком с помощью переменной running.

Пожалуйста, проверьте это, я тоже не уверен в этом.

0 голосов
/ 22 декабря 2011

вам нужно вызвать dismiss () диалогового окна вместо отмены ().

dialog.dismiss();

попробуйте это

...