Search code examples
javaandroidandroid-fragmentscountdown

Date countdown bug


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;
}
}

Solution

  • 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.