简体   繁体   中英

How to change the color of button and pause screen for few second when it clicked?

I am working on android quiz .I wanted to add button. when i click on it change Image or color and holds button for a while to check the answer and If the answer is correct then it show Green Color and wrong red color.

I have Implemented in Change of Color on button like this at the end but i don't understand how to implement Handler to delay :-

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

    }
    private void processSession(){
                /**
         * 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);
        Button nextBtn5 = (Button) findViewById(R.id.answer5);
        nextBtn5.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);
      try{ 
         new CountDownTimer(20000, 1000) {

            public void onTick(long millisUntilFinished) {
                TextView timers = (TextView) findViewById(R.id.timers);
                timers.setText("" + millisUntilFinished / 1000);
            }

            public void onFinish() { 
                currentGame.decrementScore();
                processSession();
                   }
         }.start();
      }
      catch(Exception ex)
      {
          throw new RuntimeException(ex);
      }
        }


    @Override
    public void onClick(View arg0) {
        //Log.d("Questions", "Moving to next question");
        if(arg0.getId()==R.id.answer5)
        {
        new AlertDialog.Builder(this).setMessage("Are you sure?").setCancelable(true).setPositiveButton("Yes",new DialogInterface.OnClickListener() {


        public void onClick(DialogInterface dialog,int id) {
                finish();
                 }
             }).setNegativeButton("No", null).show();

                }

        else
        {

            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) {
     try {
     final Button b=(Button) v;
     final String answer = b.getText().toString();
     counterTimer.cancel();
     b.setBackgroundResource(R.drawable.ans);
     b.setEnabled(false);

     //Log.d("Questions", "Valid Checkbox selection made - check if correct");


         handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                 if( (currentQ.getAnswer().equalsIgnoreCase(answer)))
                {
                    b.setBackgroundResource(R.drawable.ansgreen);
                    //Log.d("Questions", "Correct Answer!");
                    currentGame.incrementScore();
                }
                else{
                    b.setBackgroundResource(R.drawable.ansred);
                    //Log.d("Questions", "Incorrect Answer!");
                    currentGame.decrementScore1();
                }
           }
         }, 10000000);

       } catch (Exception e) {
           e.printStackTrace();
       }
     return true;
}

Any answer is appreciable.

Thank's in advance

We can do something like this :

final ImageButton imageButton = (ImageButton) findViewById(R.id.imageButton);
int delaySeconds = 1;

    imageButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    // return true on correct & false on incorrect 
                    if (answerTrue())
                        // change the background to green.
                        imageButton.setBackgroundResource(R.drawable.green);
                    else
                        // change the background to red.
                        imageButton.setBackgroundResource(R.drawable.red);
                }
            }, delaySeconds * 1000);
        }
    });

I have Implemented this code on button to change the color on button.Hope it work for you.

  private boolean checkAnswer(View v) {

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

            b.setBackgroundResource(R.drawable.ans);

                 b.setEnabled(false);

                if (currentQ.getAnswer().equalsIgnoreCase(answer))
                {
                    b.setBackgroundResource(R.drawable.ansgreen);
                }
                else{
                    b.setBackgroundResource(R.drawable.ansred);
                }
                return true;
            }

Handler

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());
            final Handler handle = new Handler();
            Runnable delay = new Runnable() {
                public void run() {

                    finish();
                    startActivity(new Intent(QuestionActivity.this, EndgameActivity.class));
                }
            };
            handle.postDelayed(delay,1000);
        }
        else
        {
            final Handler handle = new Handler();
            Runnable delay = new Runnable() {
                public void run() {

                    finish();
                    startActivity(new Intent(QuestionActivity.this, QuestionActivity.class));
                }
            };
            handle.postDelayed(delay,1000);
                  }
              }

You can use a Handler to delay certain actions.

Handler h = new Handler();

 h.postDelayed(new Runnable() {

     @Override
     public void run() {
         // DO DELAYED STUFF
     }
 }, delaytime); // e.g. 3000 milliseconds

The actions you take inside the run() method will be executed after the delay-time you set.

You can achieve your goal via Handler and posting it to UIThread

Imagebutton ib= (ImageButton)findViewById(R.id.YourImageButtonId); //Imagebutton default may be something different.
ib.setOnClickListener(new View.onClickListener(){
Handler h = new Handler();
 h.postDelayed(new Runnable() {

    @Override
    public void run() {
     //Put your conditions accordingly
     ib.setBackgroundResource(R.drawable.Green);     
    }
 }, delaytime); // e.g. 3000 milliseconds
});

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html You will need two threads try(){blah blah}catch. wait() the first till second notifies it it has answer setBackgroundColor on button

First of all change your manifest what is up with the package name? see the Null pointer exception in logcat? Is it really com.xxx.xxx? Are you calling a resource that is null? A try{ check the answer ...}catch ... so spawn a new thread while you change color.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM