I have question again... How can I fix this date countdown? Everytime when I launch an app, it print that it finished. If I write in code future date, app prints that it finished too. Can you help me?
package lt.sviesioji.kdainiviesiojigimnazija;
import android.os.CountDownTimer;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
/**
* A simple {@link Fragment} subclass.
*/
public class PagrindinisFragment extends Fragment {
public PagrindinisFragment() {
// Required empty public constructor
}
Button k,f;
TextView tv_countdown;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_pagrindinis, container,
false);
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Kėdainių šviesioji gimnazija");
tv_countdown = (TextView) rootView.findViewById(R.id.textView17);
Calendar start_calendar = Calendar.getInstance();
Calendar end_calendar = Calendar.getInstance();
long start_millis = start_calendar.getTimeInMillis(); //get the start time in milliseconds
long end_millis = end_calendar.getTimeInMillis(); //get the end time in milliseconds
long total_millis = (end_millis - start_millis); //total time in milliseconds
end_calendar.set(2005, 07, 1); // 10 = November, month start at 0 = January
//1000 = 1 second interval
CountDownTimer cdt = new CountDownTimer(total_millis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
tv_countdown.setText(days + ":" + hours + ":" + minutes + ":" + seconds); //You can compute the millisUntilFinished on hours/minutes/seconds
}
@Override
public void onFinish() {
tv_countdown.setText("Finish!");
}
};
cdt.start();
k = (Button) rootView.findViewById(R.id.button2);
k.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment newFragment = new KalendoriusFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
f = (Button) rootView.findViewById(R.id.button3);
f.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment newFragment = new FormulynasFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return rootView;
}
}
You're calculating the total_millis
before you change the date of the end_calendar
. Which means that the total_millis
will always be very close to 0
. To fix that, just set end_calendar
's data before you calculate the difference. Here is an example:
Calendar start_calendar = Calendar.getInstance();
Calendar end_calendar = Calendar.getInstance();
end_calendar.set(2016, 07, 1); // 10 = November, month start at 0 = January
long start_millis = start_calendar.getTimeInMillis(); //get the start time in milliseconds
long end_millis = end_calendar.getTimeInMillis(); //get the end time in milliseconds
long total_millis = (end_millis - start_millis); //total time in milliseconds
I've changed the year to 2016
(a date in the future) so that total_millis
will be set to a positive number.