Android 显示对话框时,我的活动不会暂停

Android 显示对话框时,我的活动不会暂停,android,dialog,Android,Dialog,我一直在开发一个显示问题和4个可能答案的应用程序。回答正确后,将出现下一个问题。一个错误的答案或让计时器耗尽会导致一个弹出窗口,告诉你正确的答案,你只是失去了一条生命。除了弹出窗口出现时,倒计时计时器继续并生成另一个弹出窗口外,一切都正常。我找不到方法让活动等待对话框上的按钮被按下,然后再继续下一个问题。我在这里阅读了许多问题/答案,并在android开发者网站上浏览了许多页面。对此问题的任何帮助都将不胜感激 public class MainActivity extends Activity

我一直在开发一个显示问题和4个可能答案的应用程序。回答正确后,将出现下一个问题。一个错误的答案或让计时器耗尽会导致一个弹出窗口,告诉你正确的答案,你只是失去了一条生命。除了弹出窗口出现时,倒计时计时器继续并生成另一个弹出窗口外,一切都正常。我找不到方法让活动等待对话框上的按钮被按下,然后再继续下一个问题。我在这里阅读了许多问题/答案,并在android开发者网站上浏览了许多页面。对此问题的任何帮助都将不胜感激

public class MainActivity extends Activity {

  String problems[][] = {{},{"Q1","Q2","Q3","Q4","Q5","Q6","Q7","Q8","Q9","Q10"},
    {"Q1","Q2","Q3","Q4","Q5","Q6","Q7","Q8","Q9","Q10"}};

  String answers[][] = {{},{"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10"},
    {"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10"}};

  public int level;
  private int lister[] = {1,1,2,3,4};
  Random rand = new Random();
  int holder, probcount = 0, score = 0, lives = 5;
  String problem, answer1, answer2, answer3, answer4, corrAnswer, l1, l2, l3;
  boolean correct = false, changeBG = false, timeup = false, nolives = false, inpopup = false;

  MyCount counter;
  View lv, lf1, lf2, lf3, lf4, lf5;
  MediaPlayer soundright, soundwrong;
  final Context context = this;

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main);
    lv = findViewById(R.id.quizshow);
    lf1 = findViewById(R.id.Life1);
    lf2 = findViewById(R.id.Life2);
    lf3 = findViewById(R.id.Life3);
    lf4 = findViewById(R.id.Life4);
    lf5 = findViewById(R.id.Life5);

    Log.v("Events","onCreate");

    soundright = MediaPlayer.create(this, R.raw.correct1);
    soundwrong = MediaPlayer.create(this, R.raw.correct2);

    Button btnAnswer1 = (Button)findViewById(R.id.Answer1);
    btnAnswer1.setOnClickListener(onAnswer1);

    Button btnAnswer2 = (Button)findViewById(R.id.Answer2);
    btnAnswer2.setOnClickListener(onAnswer2);

    Button btnAnswer3 = (Button)findViewById(R.id.Answer3);
    btnAnswer3.setOnClickListener(onAnswer3);

    Button btnAnswer4 = (Button)findViewById(R.id.Answer4);
    btnAnswer4.setOnClickListener(onAnswer4);

    Button btnExit = (Button)findViewById(R.id.btnExit);
    btnExit.setOnClickListener(onExit);

    Log.v("Events","onCreate2");

    TextView sc = (TextView) findViewById(R.id.Score);
    sc.setText(String.valueOf(score));

    level = 1;

    doNext();
  }

  protected void onResume() {
    Log.d("Events", "onResume");
    super.onResume();
  }

  protected void onPause() {
    Log.d("Events", "onPause");
    super.onPause();
    counter.cancel();
  }

  protected void onDestroy() {
    Log.d("Events", "onDestroy");
    super.onDestroy();
  }

  private View.OnClickListener onAnswer1=new View.OnClickListener() {
    public void onClick(View v) {
      Log.v("Events", "onAnswer1");
      if (lister[1] == lister[0]) {
        doRight();
      }
      else {
        doWrong();
      }
    };
  };

  private View.OnClickListener onAnswer2=new View.OnClickListener() {
    public void onClick(View v) {
      Log.v("Events", "onAnswer2");
      if (lister[2] == lister[0]) {
        doRight();
      }
      else {
        doWrong();
      }
    };
  };

  private View.OnClickListener onAnswer3=new View.OnClickListener() {
    public void onClick(View v) {
      Log.v("Events", "onAnswer3");
      if (lister[3] == lister[0]) {
        doRight();
      }
      else {
        doWrong();
      }
    };
  };

  private View.OnClickListener onAnswer4=new View.OnClickListener() {
    public void onClick(View v) {
      Log.v("Events", "onAnswer4");
      if (lister[4] == lister[0]) {
        doRight();
      }
      else {
        doWrong();
      }
    };
  };

  private View.OnClickListener onExit = new View.OnClickListener() {
    public void onClick(View v) {
      Log.v("Events", "onExit");
      finish();
    };
  };

  private void doNext() {

    if (changeBG == true) {
      l1 = getResources().getString(R.string.LevelDone1);
      l2 = getResources().getString(R.string.LevelDone2)+" "+String.valueOf(level);
      l3 = getResources().getString(R.string.LevelDone3);
      doPopup();

      changeBG = false;
      level = level + 1;
      score = 0;
      probcount = 0;
    }
    Log.v("Events", "DoNext1");
    probcount = probcount + 1;
    lister[0] = rand.nextInt(9);
    holder = rand.nextInt(3);
    lister[holder+1] = lister[0];

This is where I have boring code that makes sure that the 4 answers are different.

    problem = problems[level][lister[0]];
    TextView pr = (TextView) findViewById(R.id.Problem);
    pr.setText(problem);
    answer1 = answers[level][lister[1]];
    TextView a1 = (TextView) findViewById(R.id.Answer1);
    a1.setText(answer1);
    answer2 = answers[level][lister[2]];
    TextView a2 = (TextView) findViewById(R.id.Answer2);
    a2.setText(answer2);
    answer3 = answers[level][lister[3]];
    TextView a3 = (TextView) findViewById(R.id.Answer3);
    a3.setText(answer3);
    answer4 = answers[level][lister[4]];
    TextView a4 = (TextView) findViewById(R.id.Answer4);
    a4.setText(answer4);
    corrAnswer = answers[level][lister[0]];

    if (probcount < 6){
      counter = new MyCount(4000, 1);
    } else if (probcount < 11) {
      counter = new MyCount(3000, 1);
    } else if (probcount < 21) {
      counter = new MyCount(2500, 1);
    } else if (probcount < 31) {
      counter = new MyCount(2000, 1);
    } else if (probcount < 41) {
      counter = new MyCount(1500, 1);
    } else if (probcount < 51) {
      counter = new MyCount(1000, 1);
    } else {
      counter = new MyCount(750, 1);
    }
    counter.start();
  }

  private void doRight() {
    Log.v("Events", "DoRight");
    counter.cancel();
    soundright.start();
    if (probcount < 6){
      score = score +10;
    } else if (probcount < 11) {
      score = score + 20;
    } else if (probcount < 21) {
      score = score +30;
    } else if (probcount < 31) {
      score = score +40;
    } else if (probcount < 41) {
      score = score + 50;
    } else if (probcount < 51) {
      score = score + 100;
    } else {
      score = score + 200;
    }
    TextView sc = (TextView) findViewById(R.id.Score);
    sc.setText(String.valueOf(score));
    if (score > 590) {
      changeBG = true;
    }
    doNext();
  }

  private void doWrong() {

    Log.v("Events", "DoWrong");
    counter.cancel();
    soundwrong.start();
    lives = lives - 1;
    if (lives != 5) {
      if (lives == 4) {
        lf5.setVisibility(View.INVISIBLE);
      } else if (lives == 3) {
        lf4.setVisibility(View.INVISIBLE);
      } else if (lives == 2) {
        lf3.setVisibility(View.INVISIBLE);
      } else if (lives == 1) {
        lf2.setVisibility(View.INVISIBLE);
      } else if (lives == 0) {
        lf1.setVisibility(View.INVISIBLE);
        nolives = true;
      }
    }

    if (nolives) {
      l1 = getResources().getString(R.string.LivesGone1);
      l2 = getResources().getString(R.string.LivesGone2);
      l3 = getResources().getString(R.string.LivesGone3);
    } else {
      if (timeup) {
        l1 = getResources().getString(R.string.TimeExpired);
        timeup = false;
      } else {
        l1 = getResources().getString(R.string.WrongChoice);
      }
      l2 = getResources().getString(R.string.LifeLost);
      l3 = getResources().getString(R.string.CorrAnswer)+" "+corrAnswer;
    }

    doPopup();

    if (nolives) {
      score = 0;
      probcount = 0;
      TextView sc = (TextView) findViewById(R.id.Score);
      sc.setText(String.valueOf(score));
      lf1.setVisibility(View.VISIBLE);
      lf2.setVisibility(View.VISIBLE);
      lf3.setVisibility(View.VISIBLE);
      lf4.setVisibility(View.VISIBLE);
      lf5.setVisibility(View.VISIBLE);
      nolives = false;
    }
    doNext();
  }

  private void doPopup() {

    Log.v("Events", "DoPopup");
    final Dialog dialog = new Dialog(context);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.popup);
    TextView ln1 = (TextView) dialog.findViewById(R.id.Line1);
    TextView ln2 = (TextView) dialog.findViewById(R.id.Line2);
    TextView ln3 = (TextView) dialog.findViewById(R.id.Line3);
    ln1.setText(l1);
    ln2.setText(l2);
    ln3.setText(l3);
    inpopup = true;
    dialog.show();

    Button dialogButton = (Button) dialog.findViewById(R.id.btnPopup);
    dialogButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          inpopup = false;
          dialog.dismiss();
        }
      });

  }

  public class MyCount extends CountDownTimer{

    public MyCount(long millisInFuture, long countDownInterval) {
      super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
      timeup = true;
      doWrong();
    }

    @Override
    public void onTick(long millisUntilFinished) {
      double TimeLeft = millisUntilFinished;
      TextView timer1 = (TextView) findViewById(R.id.Timer);
      timer1.setText(String.valueOf(TimeLeft/1000));

    }
  }
}

你在计时器里有一个重复的循环。。。
比方说,当计时器完成时,它将调用onFinish,而您正在onFinish中调用doWrong。doWrong正在调用Dopopp,它将再次打开一个对话框。重复。为了避免这种情况,请维护一些类似布尔或int的标志,并根据标志的值,决定是在计时器完成时显示弹出对话框,还是在解除Diaog时取消计时器…

我添加此答案是为了能够将问题标记为已回答。请阅读我在问题后留下的评论


感谢所有在这个网站上提供帮助的人。我在这里学到了很多知识。

onFinish仅在计时器用完时调用。只有在您输入错误答案或调用onFinish时,才会调用doWrong。A调用B,B调用C。这不是一个无限循环。至少当你相信你读到的东西时,它不是一个循环。请参阅我对问题的评论以了解更多信息。这不起作用。找到另一份工作。请看我对问题的评论。我终于找到了问题的答案。有时我读到,在同步活动中,当显示对话框时,活动将暂停,直到对话框被取消。事实并非如此。我只需要重新编码,这样当我取消对话框而不是在doWrong结束时,doNext只从doRight调用。在改变这一点之前,我尝试了等待和通知电话,无论有没有尝试和捕捉,但都不起作用。我的任何尝试都没有成功,因为我认为doWrong例程的处理将在Dopopp调用时等待,直到对话框被取消。
private void doWrong() {

    Log.v("Events", "DoWrong");
    counter.cancel();
    soundwrong.start();
    lives = lives - 1;
    if (lives != 5) {
      if (lives == 4) {
        lf5.setVisibility(View.INVISIBLE);
      } else if (lives == 3) {
        lf4.setVisibility(View.INVISIBLE);
      } else if (lives == 2) {
        lf3.setVisibility(View.INVISIBLE);
      } else if (lives == 1) {
        lf2.setVisibility(View.INVISIBLE);
      } else if (lives == 0) {
        lf1.setVisibility(View.INVISIBLE);
        nolives = true;
      }
    }

    if (nolives) {
      l1 = getResources().getString(R.string.LivesGone1);
      l2 = getResources().getString(R.string.LivesGone2);
      l3 = getResources().getString(R.string.LivesGone3);
    } else {
      if (timeup) {
        l1 = getResources().getString(R.string.TimeExpired);
        timeup = false;
      } else {
        l1 = getResources().getString(R.string.WrongChoice);
      }
      l2 = getResources().getString(R.string.LifeLost);
      l3 = getResources().getString(R.string.CorrAnswer)+" "+corrAnswer;
    }
  // change here
   if(!timeup)
    doPopup();

    if (nolives) {
      score = 0;
      probcount = 0;
      TextView sc = (TextView) findViewById(R.id.Score);
      sc.setText(String.valueOf(score));
      lf1.setVisibility(View.VISIBLE);
      lf2.setVisibility(View.VISIBLE);
      lf3.setVisibility(View.VISIBLE);
      lf4.setVisibility(View.VISIBLE);
      lf5.setVisibility(View.VISIBLE);
      nolives = false;
    }
    doNext();
  }