Validating “from date” and “to date” in android

2019-06-22 05:38发布

I an application in which user has to choose two dates namely- from date and to date.Both the fields should not accept any date less than current date.I have gone through some posts in this website and achieved this functionality by using single datepicker dialog and single ondatesetListener.

my problem is that i am unable to validate the condition that to date should be always greater than or equal to from date.please help me.I am unable to capture the from date as the active date is overide by the active end date Thanks in advance.Following is the code:

public class Leave_form extends Activity 
{       
    private static EditText tvDislpayResult;
    private Button startPickDate;
    private Button endPickDate;
    private Calendar startDate;
    private Calendar endDate;
    //private EditText startDateDisplay;
    //private EditText endDateDisplay;
    static final int DATE_DIALOG_ID = 0;
    private TextView startDateDisplay;
    private TextView endDateDisplay;
    private TextView activeDateDisplay;
    private Calendar activeDate;
    private Calendar currentDate;
    private Calendar fromDate;

    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leave_form);

        /*  capture our View elements for the start date function   */
        startDateDisplay = (EditText) findViewById(R.id.e_from_date);
        startPickDate = (Button) findViewById(R.id.Set_date1);

        /*get tday date  */   

        currentDate=Calendar.getInstance();
        Log.d("currentDate ",""+(currentDate.get(Calendar.DAY_OF_MONTH))+(currentDate.get(Calendar.MONTH)+1)+(currentDate.get(Calendar.YEAR)));

        /* get the current date */
        startDate = Calendar.getInstance();
        Log.d("startdate ",""+(startDate.get(Calendar.DAY_OF_MONTH))+(startDate.get(Calendar.MONTH)+1)+(startDate.get(Calendar.YEAR)));

        /* add a click listener to the button   */
        startPickDate.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v) 
            {
                showDateDialog(startDateDisplay, startDate);
                Log.d("startDate-on click ",""+(startDate.get(Calendar.DAY_OF_MONTH))+(startDate.get(Calendar.MONTH)+1)+(startDate.get(Calendar.YEAR)));

            }
        });

        /* capture our View elements for the end date function */
        endDateDisplay = (EditText) findViewById(R.id.e_to_date);
        endPickDate = (Button) findViewById(R.id.Set_date2);

        /* get the current date */
        endDate = Calendar.getInstance();
        Log.d("endDate ",""+(endDate.get(Calendar.DAY_OF_MONTH))+(endDate.get(Calendar.MONTH)+1)+(endDate.get(Calendar.YEAR)));

        /* add a click listener to the button   */
        endPickDate.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                showDateDialog(endDateDisplay, endDate);
                Log.d("endDate -on click",""+(endDate.get(Calendar.DAY_OF_MONTH))+(endDate.get(Calendar.MONTH)+1)+(endDate.get(Calendar.YEAR)));
            }
        });

        /* display the current date (this method is below)  */
       // updateDisplay(startDateDisplay, startDate);
       // updateDisplay(endDateDisplay, endDate);
    }

    private void updateDisplay(TextView dateDisplay, Calendar date) 
    {
        dateDisplay.setText(
                new StringBuilder()
                    // Month is 0 based so add 1
                    .append(date.get(Calendar.DAY_OF_MONTH) ).append("-")
                    .append(date.get(Calendar.MONTH)+1).append("-")
                    .append(date.get(Calendar.YEAR)).append(" "));

        Log.d("msg","date:"+(date.get(Calendar.DAY_OF_MONTH))+(date.get(Calendar.MONTH)+1)+(date.get(Calendar.YEAR)));

        fromDate=date;
    }

    public void showDateDialog(TextView dateDisplay, Calendar date)
    {
        Log.d("SDD", dateDisplay.getText().toString());
        Log.d("startdate ",""+(currentDate.get(Calendar.DAY_OF_MONTH))+(currentDate.get(Calendar.MONTH)+1)+(currentDate.get(Calendar.YEAR)));
       activeDateDisplay = dateDisplay;
        activeDate = date;
        showDialog(DATE_DIALOG_ID);
    }

    private OnDateSetListener dateSetListener = new OnDateSetListener()
    {
        @SuppressWarnings("deprecation")
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            activeDate.set(Calendar.YEAR, year);
            activeDate.set(Calendar.MONTH, monthOfYear);
            activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            Log.d("activeDate-on dateset ",""+(activeDate.get(Calendar.DAY_OF_MONTH))+(activeDate.get(Calendar.MONTH)+1)+(activeDate.get(Calendar.YEAR)));

            if(currentDate.after(activeDate)|(currentDate.equals(activeDate)))
            {
                Toast toast=Toast.makeText(Leave_form.this, "Please select a valid date", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();


            }
            else
            {
                if((currentDate.after(activeDate)|(currentDate.equals(activeDate)))&&(startDateDisplay.getText().toString()!=null))
                {
                    Log.d("startDate-on click ",""+(startDate.get(Calendar.DAY_OF_MONTH))+(startDate.get(Calendar.MONTH)+1)+(startDate.get(Calendar.YEAR)));
                    if(startDate.before(activeDate))
                    {
                        updateDisplay(activeDateDisplay, activeDate);
                    }

                    else
                    {
                        Toast.makeText(getApplicationContext(), "enter valid date", Toast.LENGTH_SHORT).show();
                        /*AlertDialog alertDialog=new AlertDialog.Builder(Leave_form.this).create();

                        alertDialog.setMessage("Choose a valid date");

                        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub

                            }
                        });
                        alertDialog.show();*/
                    }
                }
                else
                {
                    updateDisplay(activeDateDisplay, activeDate);
                }

           }

            unregisterDateDisplay();
        }
    };

    private void unregisterDateDisplay() 
    {
        Log.d("startdate ",""+(currentDate.get(Calendar.DAY_OF_MONTH))+(currentDate.get(Calendar.MONTH)+1)+(currentDate.get(Calendar.YEAR)));
        Log.d("from date:","-"+activeDate.DAY_OF_MONTH+activeDate.MONTH+activeDate.YEAR);
        activeDateDisplay = null;
        activeDate = null;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {

            case DATE_DIALOG_ID:
                Log.d("fromdate","msg");
                Log.d("id",""+DATE_DIALOG_ID);
                return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
        }
        return null;
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
        switch (id) {
            case DATE_DIALOG_ID:
                Log.d("id",""+DATE_DIALOG_ID);
                ((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
                break;
        }
    }

    public void leave(View view)
    {
        Intent intent1=new Intent(this,Rough.class);
        setContentView(R.layout.activity_rough);
        startActivity(intent1);
    }
    public void logout(View view)
    {
        Intent intent2=new Intent (this,MainActivity.class);
        setContentView(R.layout.activity_main);
        startActivity(intent2);
    }
}

4条回答
迷人小祖宗
2楼-- · 2019-06-22 06:11

It is better to change such codes:

if((currentDate.after(activeDate)|(currentDate.equals(activeDate)))&&(startDateDisplay.getText().toString()!=null))

to multiple if blocks like:

if((currentDate.after(activeDate)||(currentDate.equals(activeDate))
    if(!startDateDisplay.getText().toString().equals(null))

Note carefully the differences!

Also look at this answer here

查看更多
The star\"
3楼-- · 2019-06-22 06:11

Solved..

Thanks @Amit for the answer.My problem is solved and it works like a charm.I have changed only the code in OnDateSetListener segment.Following is the code:

 public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
    {


        activeDate.set(Calendar.YEAR, year);
        activeDate.set(Calendar.MONTH, monthOfYear);
        activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);



        Date fromDate,toDate;
        try
            {


                //checks if the date chosen by the user is greater than the current system date.Doesnt allow to choose past date
                if(currentDate.before(activeDate)||currentDate.equals(activeDate))
                {

                    //checks if the from date edit text is empty or not
                    if(startDateDisplay.getText().toString().isEmpty())
                    {

                        updateDisplay(activeDateDisplay, activeDate);

                    }
                    else
                    {


                        //converts the date in the from date edittextbox and active date to dd-mm-yyyy format
                        SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");

                        fromDate=sdf.parse(startDateDisplay.getText().toString());
                        Log.d("fromdate",""+fromDate);

                        String temp=(activeDate.get(Calendar.DAY_OF_MONTH))+"-"+(activeDate.get(Calendar.MONTH)+1)+"-"+(activeDate.get(Calendar.YEAR));
                        toDate=sdf.parse(temp);
                        Log.d("todate",""+toDate);


                        //checks if todate is greater or equal to from date 
                        if ((toDate.after(fromDate))||(toDate.equals(fromDate)))
                        {
                            updateDisplay(activeDateDisplay, activeDate);

                        }
                        else
                        {
                            Toast toast=new Toast(getBaseContext());
                            toast=Toast.makeText(Leave_form.this, "To date should be greater than From date", Toast.LENGTH_SHORT);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
                        }
                    }
                }

                else
                {
                    Toast toast=new Toast(getBaseContext());
                    toast=Toast.makeText(Leave_form.this, "Please enter a valid date", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            }
        catch(Exception e)
        {
            Log.e("excepion",e.getMessage().toString());
        }
        unregisterDateDisplay();
    }
};

Thanks all of you for the answers. :)

查看更多
我想做一个坏孩纸
4楼-- · 2019-06-22 06:15
package com.example.pickerdate;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private TextView mDateDisplay;
    private int mYear;
    private int year1;
    private int mMonth;
    private int mDay;
    private int month;
    private int day;
    static final int DATE_DIALOG_ID = 1;
    Button pickDate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
        pickDate = (Button) findViewById(R.id.pickDate);
        pickDate.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                System.out.println("hello3");
                showDialog(DATE_DIALOG_ID);

            }
        });

        System.out.println("hello1");
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        updateDisplay();
        year1 = mYear;
        month = mMonth;
        day = mDay;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        DatePickerDialog _date = null;
        switch (id) {

        case DATE_DIALOG_ID:
            _date = new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
                    mDay) {
                @Override
                public void onDateChanged(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {
                    System.out.println("----------onDateChanged()-----------"
                            + mYear + "--" + year);
                    System.out.println("----------onDateChanged()-----------"
                            + mMonth + "--" + monthOfYear);
                    System.out.println("----------onDateChanged()-----------"
                            + mDay + "--" + dayOfMonth);

                    /*
                     * These lines of commented code used for only setting the
                     * maximum date on Date Picker..
                     * 
                     * if (year > mYear && year) view.updateDate(mYear, mMonth,
                     * mDay);
                     * 
                     * if (monthOfYear > mMonth && year == mYear )
                     * view.updateDate(mYear, mMonth, mDay);
                     * 
                     * if (dayOfMonth > mDay && year == mYear && monthOfYear ==
                     * mMonth) view.updateDate(mYear, mMonth, mDay);
                     */

                    // these below lines of code used for setting the maximum as
                    // well as minimum dates on Date Picker Dialog..

                    if ((mYear > year)
                            || ((mMonth > monthOfYear) && (mYear == year))
                            || ((mDay > dayOfMonth) && (mYear == year) && (mMonth == monthOfYear))) {
                        view.updateDate(year1, month, day);

                    }

                }
            };

        }
        System.out.println("hello5");
        return _date;
    }

    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {

        case DATE_DIALOG_ID:
            System.out.println("hello6");

            ((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
            break;
        }
    }

    private void updateDisplay() {
        System.out.println("hello2");
        mDateDisplay.setText(new StringBuilder()
                // Month is 0 based so add 1
                .append(mMonth + 1).append("-").append(mDay).append("-")
                .append(mYear).append(" "));
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
            System.out.println("hello7");

            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            System.out.println("year=" + year);
            System.out.println("month=" + monthOfYear);
            System.out.println("day=" + dayOfMonth);
            updateDisplay();
        }
    };
}
查看更多
成全新的幸福
5楼-- · 2019-06-22 06:34

Here I have shown a simple technique to convert user inputted string to Date and compare according to our logic.

public class Main {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();

        Date selectedDate = null;
        Date currentDate = null;


        //Formatter to format the date given by system
        SimpleDateFormat requiredFormant =  new SimpleDateFormat("yyyy-MM-dd");


        //To get current Date
        try {
            currentDate = requiredFormant.parse(requiredFormant.format(calendar.getTime()));
        } catch (ParseException e) {
            e.printStackTrace();
        }

        // user inputted Text ,it can be from EditText Etc
        try {
             selectedDate = requiredFormant.parse("2019-01-09");
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //Logic to compare dates
        if (currentDate.equals(selectedDate))
            System.out.println("You born today ?");
        else if(currentDate.after(selectedDate))
            System.out.println("Good to proceed");
        else
            System.out.println("Not Possible");


    }

}
查看更多
登录 后发表回答