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.