I have four balls on the screen red , blue , green , yellow which has two states ON , OFF. Initially all of them are in OFF state.My requirement is that I have a string suppose "RBYGRBYG" and for every letter i want to change the state of the corresponding ball one by one (R->RED,B->BLUE,Y->YELLOW,G->GREEN) for 0.5 seconds. But my code for playString("RBYGRBYG"); changes the state of all balls simultaneously at once for 0.5 seconds instead of changing it one by one.
private void playString(String str) {
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)=='R')
{
red.setImageResource(R.drawable.red_on);
new CountDownTimer(500,100){
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
red.setImageResource(R.drawable.red_off);
}
}.start();
}
if(str.charAt(i)=='B')
{
blue.setImageResource(R.drawable.blue_on);
new CountDownTimer(500,100){
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
blue.setImageResource(R.drawable.blue_off);
}
}.start();
}
if(str.charAt(i)=='G')
{
green.setImageResource(R.drawable.green_on);
new CountDownTimer(500,100){
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
green.setImageResource(R.drawable.green_off);
}
}.start();
}
if(str.charAt(i)=='Y')
{
yellow.setImageResource(R.drawable.yellow_on);
new CountDownTimer(500,100){
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
yellow.setImageResource(R.drawable.yellow_off);
}
}.start();
}
}
}
Try this :
private int i= 0; // class field
private void playString(String str) {
i++;
if (i == str.length())
i = 0;
if(str.charAt(i)=='R')
// the rest of the code the same removing one "}" at the end
Let's see if I got it right:
-for each letter on your string, you want to change the state of the ball(coresponding with the char in string).
Maybe try with a while instead of for, and you will increment i++ only in the function onFinish() this way it will get to the next color only if previous one has stopped.
EDIT Hope this helps :
private void playString(String str){
while (i < str.length()){
if(str.charAt(i)=='R'){
red.setImageResource(R.drawable.red_on);
new CountDownTimer(500,100){
#Override
public void onTick(long millisUntilFinished) {
}
#Override
public void onFinish() {
red.setImageResource(R.drawable.red_off);
i+=1;
}
}.start();
}
}
}
Related
I define the countdowntimer here.
Then, new countdowntimer is defined for this variable in an onclick method:
public void showQuestion(int questionNumber){
questionTimer = new CountDownTimer(10500,1000) {
#Override
public void onTick(long millisUntilFinished) {
remainingTime.setText(Long.toString(millisUntilFinished/1000));
}
#Override
public void onFinish() {
remainingTime.setText("0");
showCorrectAnswer();
}
}.start();
}
Then i cancel this timer on another button' onclick method;
public void selectOption(View view) {
questionTimer.cancel();
}
In this time, it is succesfully cancelled. Then i am doing the same again. showQuestion method is working in the same way.
public void showQuestion(int questionNumber){
questionTimer = new CountDownTimer(10500,1000) {
#Override
public void onTick(long millisUntilFinished) {
remainingTime.setText(Long.toString(millisUntilFinished/1000));
}
#Override
public void onFinish() {
remainingTime.setText("0");
showCorrectAnswer();
}
}.start();
}
It is started succesfully. When i want to cancel this timer on another button onclick method, it is not working. Not any error. I hope it could be clear. Thank you so much.
The issue with your code is the timer can be started multiple times (sometimes not intentional) before the first timer is finished or cancelled. In that case, when you try to cancel it, you can only cancel the first timer. To solve this issue, you only have to check whether the timer is running, if it is running, wait for it to finish or cancel.
Define a global parameter:
Boolean timerRunning = false;
public void showQuestion(int questionNumber){
if (timerRunning) return;
timerRunning = true;
questionTimer = new CountDownTimer(10500,1000) {
#Override
public void onTick(long millisUntilFinished) {
remainingTime.setText(Long.toString(millisUntilFinished/1000));
}
#Override
public void onFinish() {
remainingTime.setText("0");
showCorrectAnswer();
timerRunning = false;
}
}.start();
}
Your selection option method can be changed to below: check if the timer is null before cancelling it.
public void selectOption(View view) {
if (questionTimer != null) questionTimer.cancel();
timerRunning = false;
}
public void selectOption(View view) {
questionTimer.cancel();
questionTimer = null;
}
I have the user inputting the time in the countdown timer.
Right now, its fixed to 10sec. How can i change this to user input ?
CountDownTimer counter = new CountDownTimer(10000,1000) {
#Override
public void onTick(long millisUntilFinished) {
//millisUntilFinished=20000;
settime.setText("" + millisUntilFinished / 1000);
}
#Override
public void onFinish() {
quescount++;
if (quescount%5==0){
round ++;
rndno.setText(String.valueOf(round));
// onBackPressed();
}
quescounter.setText("Out of "+String.valueOf(quescount));
// j = randomcount(getcount(),1);
++qcounter;
//j=qcounter;
if (qcounter<count)
setdata(String.valueOf(list.get(qcounter)));
else
{
Collections.shuffle(list);
qcounter=0;
setdata(String.valueOf(list.get(qcounter)));
}
}
};
Call this method where you take the input from the user:
public void startCountDown(long duration) {
CountDownTimer counter = new CountDownTimer(duration, 1000) {
#Override
public void onTick(long millisUntilFinished) {
//millisUntilFinished=20000;
settime.setText("" + millisUntilFinished / 1000);
}
#Override
public void onFinish() {
quescount++;
if (quescount%5==0){
round ++;
rndno.setText(String.valueOf(round));
// onBackPressed();
}
quescounter.setText("Out of "+String.valueOf(quescount));
// j = randomcount(getcount(),1);
++qcounter;
//j=qcounter;
if (qcounter<count)
setdata(String.valueOf(list.get(qcounter)));
else
{
Collections.shuffle(list);
qcounter=0;
setdata(String.valueOf(list.get(qcounter)));
}
}
};
}
You'll probably want to make your CountDownTimer variable global as well.
I have small question.
new CountDownTimer(12000, 2000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
}
}.start();
Here I would like setText to 6 different TextView(in one xml) with each onTick(). Any ideas how i can make this? Thanks
//edit
I would like have something like this
First tick
tv.setText("one")
Second Tick
tv2.setText("two")
try using Array of TextViews like
TextView[] textViews = new TextView[6];
String[] value = new String[]{"one","two","three","four","five","six"};
int count = 0;
new CountDownTimer(12000, 2000) {
public void onTick(long millisUntilFinished) {
textViews[count].setText(value[count]);// you can set dynamic string variable also
count++;
}
public void onFinish() {
}
}.start();
You could do something like this:
new CountDownTimer(12000, 2000) {
int counter = 0;
public void onTick(long millisUntilFinished) {
switch (counter) {
case 0:
tv1.setText("");
break;
case 1:
tv2.setText("");
break;
// ...
}
counter++;
}
public void onFinish() {
}
}.start();
Check Below Answer,
new CountDownTimer(12000, 2000) {
public void onTick(long millisUntilFinished) {
Activity_Name.this.runOnUiThread(new Runnable() {
#Override
public void run() {
tv1.setText("");
tv2.setText("");
tv3.setText("");
tv4.setText("");
}
});
}
public void onFinish() {
}
}.start();
I'm writing a android application. I have a CountDownTimer in between my application and i want until the timer to zero, all my app run(user must be select the true Button) and when become zero and the user did'nt anything, the other action performed (the user loses).
this is CountDownTimer :
new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
a.setText("" + millisUntilFinished / 1000);
/*while (millisUntilFinished / 1000 != 1) {
}*/
}
public void onFinish() {
a.setText("done!");
}
}.start();
and this is part of code:
if ((randomAndroidColor1 == rainbow[0]) {
findViewById(ans).setBackgroundColor(rainbow2[0]);
findViewById(ans).setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
c3.setBackgroundColor(rainbow1[2]);
}
});
}
How to access to millisUntilFinished variable in above if condition?
Timer and if condition worked correctly but I want to combine them.
If I understood correctly , you can use an instance boolean variable.
boolean isWon = false;
private void countDown() {
isWon=false; // Reset every method call.
// Set listener once in method.
findViewById(R.id.answer).setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
isWon=true;
}
});
new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
// onTick works.
}
public void onFinish() {
if(isWon){
// Won
}else{
// Lose
}
}
}.start();
}
I try to do app which show elements. Each element should start showing when the before element was hidden. Each element is showing 2 seconds.
Code:
public void gameStart()
{
do
{
data = random.nextInt(6) + 1;
if (data == 1)
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element1.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element1.setVisibility(View.GONE);
}
}.start();
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element2.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element2.setVisibility(View.GONE);
}
}.start();
} else if (data == 3)
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element3.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element3.setVisibility(View.GONE);
}
}.start();
} else if (data == 4)
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element4.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element4.setVisibility(View.GONE);
}
}.start();
} else if (data == 5)
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element5.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element5.setVisibility(View.GONE);
}
}.start();
} else if (data == 6)
{
CountDownTimer cdt = new CountDownTimer(2000, 1000)
{
#Override
public void onTick(long millisUntilFinished)
{
element6.setVisibility(View.VISIBLE);
}
#Override
public void onFinish()
{
element6.setVisibility(View.GONE);
}
}.start();
}
id = id + 1;
text.setText("cos " + id);
} while (id < 3);
All elements are being shown in the same time. And I try add
Thread.sleep(2500);
But this stoped the action in window. I try add this after code:
Timer timer = new Timer();
timer.schedule( new TimerTask() {
public void run() {
}
}, 0, 60*1000);
But loop wasn't stay. I try do it with notify() and wait(), but it also don't work.
Don't suggest me to do do next action in onFinish() because this must be repeat a lot.
Anybody have another idea?
EDIT
I also use Handler but it don't work
I would recommend you not to implement this code in the main thread.
Create an async task, which hides a button and on postExequte calls itself.