How to change the color of a button and pause for a few seconds when pressed?

I am working on an android quiz. I wanted to add a button. when I click on it, change the image or color and hold the button for a while to check the answer, and if the answer is correct, then it shows green and wrong red.

I implemented in a color change on a button similar to this one at the end, but I donโ€™t understand how to implement a handler for the 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 noticeable.

thanks in advance

+4
source share
6 answers

I implemented this code on a button to change the color on a button. Hope it works 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); } } 
+2
source

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); } }); 
+3
source

You can use Handler to delay specific actions.

 Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { // DO DELAYED STUFF } }, delaytime); // eg 3000 milliseconds 

Actions performed inside the run() method will be executed after the delay time .

+1
source

You can achieve your goal with Handler and send 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); // eg 3000 milliseconds }); 
+1
source

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

0
source

First of all, change your manifest, what is the name of the package? see Null pointer exception in logcat? Is this really com.xxx.xxx? Do you call the resource null? Try {check the answer ...} catch ... so create a new thread while you change color.

0
source

Source: https://habr.com/ru/post/1501078/


All Articles