how to trigger timer from other class and its Text

2019-01-29 07:42发布

I am working on android quiz and want timer on my each question-answer page. I have menu page in my quiz and play button to start game. And i want this timer is triggered when i click on play button. For this i have to create TextView in question XML that represent my menu page. And implementation in QuestionActivity class which represent my first question page. i am also posting WelcomeActivity class although its not play any role in this question.

Play Button Layout

<Button 
            android:text="Play" 
            android:id="@+id/playBtn"
            android:layout_width="80dip" 
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content"
            android:paddingTop="5dip" 
            android:paddingBottom="5dip"
            android:textColor="#ffffff"
            android:background="@drawable/start_button" />

Question XML representing TextView for Timer

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/question"
    android:layout_centerHorizontal="true"
    android:background="@drawable/timer_bttn" 
    android:onClick="onClick"/>

QuestionActivity where i implemented timer code

public class QuestionActivity extends Activity implements OnClickListener{

    private Question currentQ;
    private GamePlay currentGame;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.question);
        /**
         * Configure current game and get question
         */
        currentGame = ((CYKApplication)getApplication()).getCurrentGame();
        currentQ = currentGame.getNextQuestion();
        Button nextBtn1 = (Button) findViewById(R.id.answer1);
        nextBtn1.setOnClickListener(this);
        Button nextBtn2 = (Button) findViewById(R.id.answer2);
        nextBtn2.setOnClickListener(this);
        Button nextBtn3 = (Button) findViewById(R.id.answer3);
        nextBtn3.setOnClickListener(this);
        Button nextBtn4 = (Button) findViewById(R.id.answer4);
        nextBtn4.setOnClickListener(this);
        /**
         * Update the question and answer options..
         */
        setQuestions();

    }


    /**
     * Method to set the text for the question and answers from the current games
     * current question
     */
    private void setQuestions() {
        //set the question text from current question
        String question = Utility.capitalise(currentQ.getQuestion());
        TextView qText = (TextView) findViewById(R.id.question);
        qText.setText(question);

        //set the available options
        List<String> answers = currentQ.getQuestionOptions();
        TextView option1 = (TextView) findViewById(R.id.answer1);
        option1.setText(Utility.capitalise(answers.get(0)));

        TextView option2 = (TextView) findViewById(R.id.answer2);
        option2.setText(Utility.capitalise(answers.get(1)));

        TextView option3 = (TextView) findViewById(R.id.answer3);
        option3.setText(Utility.capitalise(answers.get(2)));

        TextView option4 = (TextView) findViewById(R.id.answer4);
        option4.setText(Utility.capitalise(answers.get(3)));

        int score = currentGame.getScore();
        String scr = String.valueOf(score);
        TextView score1=(TextView) findViewById(R.id.score);
        score1.setText(scr);
    }


    @Override
    public void onClick(View arg0) {
        //Log.d("Questions", "Moving to next question");
        if(!checkAnswer(arg0)) return;  

        /**
         * check if end of game
         */
        if (currentGame.isGameOver()) {
            //Log.d("Questions", "End of game! lets add up the scores..");
            //Log.d("Questions", "Questions Correct: " + currentGame.getRight());
        //Log.d("Questions", "Questions Wrong: " + currentGame.getWrong());
        Intent i = new Intent(this, EndgameActivity.class);
        startActivity(i);
        finish();
        }
        else {
            Intent i = new Intent(this, QuestionActivity.class);
        startActivity(i);
        finish();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode)
        {
        case KeyEvent.KEYCODE_BACK :
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }


    /**
     * Check if a checkbox has been selected, and if it
     * has then check if its correct and update gamescore
     */
    private boolean checkAnswer(View v) {

        Button b=(Button) v;
        String answer = b.getText().toString();

        //Log.d("Questions", "Valid Checkbox selection made - check if correct");
        if (currentQ.getAnswer().equalsIgnoreCase(answer))
        {
        //Log.d("Questions", "Correct Answer!");
        currentGame.incrementScore();
        }
        else {
        //Log.d("Questions", "Incorrect Answer!");
        currentGame.decrementScore();
        }

        return true;
    }

    public void setTimer() {
        long finishTime = 5;
        CountDownTimer counterTimer = new CountDownTimer(finishTime * 1000, 1000) {
            public void onFinish() {
                //code to execute when time finished
            }

            public void onTick(long millisUntilFinished) {
                int seconds = (int) (millisUntilFinished / 1000);
                int minutes = seconds / 60;
                seconds = seconds % 60;

                if (seconds < 10) {
                    txtTimer.setText("" + minutes + ":0" + seconds);
                } else {
                    txtTimer.setText("" + minutes + ":" + seconds);
                }
            }
        };
        counterTimer.start();
    }

}

WelcomeActivity

public class WelcomeActivity extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.welcome);

    //////////////////////////////////////////////////////////////////////
    //////// GAME MENU  /////////////////////////////////////////////////
    Button playBtn = (Button) findViewById(R.id.playBtn);
    playBtn.setOnClickListener(this);
    Button settingsBtn = (Button) findViewById(R.id.settingsBtn);
    settingsBtn.setOnClickListener(this);
    Button rulesBtn = (Button) findViewById(R.id.rulesBtn);
    rulesBtn.setOnClickListener(this);
    Button exitBtn = (Button) findViewById(R.id.exitBtn);
    exitBtn.setOnClickListener(this);
}


/**
 * Listener for game menu
 */
@Override
public void onClick(View v) {
    Intent i;

    switch (v.getId()){
    case R.id.playBtn :
        //once logged in, load the main page
        //Log.d("LOGIN", "User has started the game");

        //Get Question set //
        List<Question> questions = getQuestionSetFromDb();

        //Initialise Game with retrieved question set ///
        GamePlay c = new GamePlay();
        c.setQuestions(questions);
        c.setNumRounds(getNumQuestions());
        ((CYKApplication)getApplication()).setCurrentGame(c);  

        //Start Game Now.. //
        i = new Intent(this, QuestionActivity.class);
        startActivityForResult(i, Constants.PLAYBUTTON);
        break;

    case R.id.rulesBtn :
        i = new Intent(this, RulesActivity.class);
        startActivityForResult(i, Constants.RULESBUTTON);
        break;

    case R.id.settingsBtn :
        i = new Intent(this, SettingsActivity.class);
        startActivityForResult(i, Constants.SETTINGSBUTTON);
        break;

    case R.id.exitBtn :
        finish();
        break;
    }

}

1条回答
祖国的老花朵
2楼-- · 2019-01-29 08:26

As mentioned by Piyush Gupta, you should call the setTimer() method from onResume in your QuestionActivity.

From the Android Developer Documentation:

(onResume is) called for your activity to start interacting with the user. This is a good place to begin animations, open exclusive-access devices (such as the camera), etc.

In your code you should also make the counterTimer you use in setTimer() a class member, not a local variable; if you don't it will go out of scope once the setTimer() call completes and your access to it will be lost.

So you will need to add the following to QuestionActivity:

public class QuestionActivity extends Activity implements OnClickListener{

    // NEW: add counterTimer as a member
    private CountDownTimer counterTimer;

    // NEW: implement onResume
    @Override
    public void onResume() {
        setTimer();
        super.onResume();
    }

    // CHANGE: setTimer should be changed as follows
    public void setTimer() {
        long finishTime = 5;
        // NOTE: use the member, instead of a local
        counterTimer = new CountDownTimer(finishTime * 1000, 1000) {
            public void onFinish() {
                //code to execute when time finished
            }

            public void onTick(long millisUntilFinished) {
                int seconds = (int) (millisUntilFinished / 1000);
                int minutes = seconds / 60;
                seconds = seconds % 60;

                if (seconds < 10) {
                    txtTimer.setText("" + minutes + ":0" + seconds);
                } else {
                    txtTimer.setText("" + minutes + ":" + seconds);
                }
            }
        };
        counterTimer.start();
    }
}

This above example uses your code as it is now, but I would advise you to create the timer in onCreate using the class member to store it (ie. everything that is currently in setTimer(), except for the counterTimer.start(); call. Then just use counterTimer.start(); in onResume. And maybe add a counterTimer.cancel() call to onPause so that the timer ends when the activity loses focus.

查看更多
登录 后发表回答