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

时间:2013-12-29 03:47:33

标签: android dialog

我一直在处理显示问题的应用程序和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));

    }
  }
}

3 个答案:

答案 0 :(得分:0)

你有一个重复的循环,无论是一个计时器...... 假设,当您的计时器结束时,它会拨打onFinish()并且您正在doWrong()中呼叫onFinish()。并且doWrong()正在调用doPopUp(),这将再次打开一个Dialog。(重复)。为了避免,维护一些标志(如booleanint)并根据标志的值,您决定在计时器完成时是显示PopUp对话框还是在您取消Timer时正在解雇Diaog ......

答案 1 :(得分:0)

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();
  }

答案 2 :(得分:0)

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

感谢所有在本网站上提供帮助的人。我在这里获得了很多知识。