无法在数据选取器上显示当前数据

Unable to Current Data on Data picker

我创建了一个自定义数据选择器,我在其中显示了 1950 年至 2016 年的年份。 现在,当我第一次打开选择器时,我想设置当天的当前数据。但我无法将其设置为当前数据。首次启动后,它完全按照我希望的方式工作。

这是我目前试过的代码

private void openDatePicker(int month, int day, int year) {
        try {

            Log.e("calender", "MONTH = " + month);
            Log.e("calender", "DAY_OF_WEEK = " + day);
            Log.e("calender", "YEAR = " + year);

            m_calendar.set(Calendar.DAY_OF_MONTH, month);
            m_calendar.set(Calendar.MONTH, day);
            m_calendar.set(Calendar.YEAR, year);

            int p_minYear, p_minMonth, p_minDay;
            int p_maxYear, p_maxMonth, p_maxDay;

            p_minDay = 1;
            p_minMonth = 0;
            p_minYear = 1950;

            p_maxDay = 31;
            p_maxMonth = 11;
            p_maxYear = 2016;

            Calendar m_maxDateCalendar = Calendar.getInstance();
            m_maxDateCalendar.set(Calendar.YEAR, p_maxYear);
            m_maxDateCalendar.set(Calendar.MONTH, p_maxMonth);
            m_maxDateCalendar.set(Calendar.DAY_OF_MONTH, p_maxDay);

            Calendar m_minDateCalendar = Calendar.getInstance();
            m_minDateCalendar.set(Calendar.YEAR, p_minYear);
            m_minDateCalendar.set(Calendar.MONTH, p_minMonth);
            m_minDateCalendar.set(Calendar.DAY_OF_MONTH, p_minDay);

            new YearPicker(m_context, m_datePickerListener, m_minDateCalendar,
                    m_maxDateCalendar, m_calendar).show();
        } catch (Throwable p_e) {
            // Have suppressed the exception
            p_e.printStackTrace();
        }
    }

这是我用于年份选择器的 calss YearPicker.Java

public class YearPicker extends DatePickerDialog {
    private int maxYear = 0;
    private int maxMonth = 0;
    private int maxDay = 0;

    private int minYear = 0;
    private int minMonth = 0;
    private int minDay = 0;
    private Calendar m_minDateCalendar, m_maxDateCalendar, m_calendar;

    private boolean m_fired = false;

    public YearPicker(Context context, OnDateSetListener callBack,
            Calendar p_minCalendar, Calendar p_maxCalendar,
            Calendar p_currentCalendar) {
        super(context, callBack, p_currentCalendar.get(Calendar.YEAR),
                p_currentCalendar.get(Calendar.MONTH), p_currentCalendar
                        .get(Calendar.DAY_OF_MONTH));

        m_minDateCalendar = (Calendar) p_minCalendar.clone();
        m_maxDateCalendar = (Calendar) p_maxCalendar.clone();
        m_calendar = (Calendar) p_currentCalendar.clone();
//      m_calendar = p_currentCalendar;

        Log.e("m_calendar", "=> " + m_calendar.get(Calendar.MONDAY));
        Log.e("m_calendar", "=> " + m_calendar.get(Calendar.DAY_OF_WEEK));
        Log.e("m_calendar", "=> " + m_calendar.get(Calendar.YEAR));

        this.minDay = m_minDateCalendar.get(Calendar.DAY_OF_MONTH);
        this.minMonth = m_minDateCalendar.get(Calendar.MONTH);
        this.minYear = m_minDateCalendar.get(Calendar.YEAR);
        this.maxDay = m_maxDateCalendar.get(Calendar.DAY_OF_MONTH);
        this.maxMonth = m_maxDateCalendar.get(Calendar.MONTH);
        this.maxYear = m_maxDateCalendar.get(Calendar.YEAR);

        try {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                m_fired = false;
                this.getDatePicker().setMaxDate(
                        m_maxDateCalendar.getTime().getTime());
                this.getDatePicker().setMinDate(
                        m_minDateCalendar.getTime().getTime());
            } else {
                m_fired = true;
            }
        } catch (Throwable p_e) {

            Log.d("m_maxDateCalendar", ""
                    + m_maxDateCalendar.getTime().getTime());
            Log.d("m_minDateCalendar", ""
                    + m_minDateCalendar.getTime().getTime());
            Log.d("m_calendar", "" + m_calendar.getTime().getTime());
            p_e.printStackTrace();
        }
    }

    @Override
    public void onDateChanged(DatePicker p_view, int p_year, int p_monthOfYear,
            int p_dayOfMonth) {
        super.onDateChanged(p_view, p_year, p_monthOfYear, p_dayOfMonth);

        if (m_fired) {
            m_calendar.set(Calendar.YEAR, p_year);
            m_calendar.set(Calendar.MONTH, p_monthOfYear);
            m_calendar.set(Calendar.DAY_OF_MONTH, p_dayOfMonth);

            if (m_calendar.after(m_maxDateCalendar)) {
                m_fired = true;
                if (maxMonth > 11) {
                    maxMonth = 11;
                }
                p_view.updateDate(maxYear, maxMonth, maxDay);
            } else if (m_calendar.before(m_minDateCalendar)) {
                m_fired = true;
                if (minMonth > 11) {
                    minMonth = 11;
                }
                p_view.updateDate(minYear, minMonth, minDay);
            } else {
                m_fired = true;
                p_view.updateDate(p_year, p_monthOfYear, p_dayOfMonth);
            }
        }
    }

}

我现在想要什么

我想在第一次打开选择器时设置当前日期..

例如! 如果用户想要 select 日期,那么他最初将没有日期 selected。但是当他单击日期部分时,系统会提示他使用日期选择器。那时我想设置当天的当前日期。谢谢,请帮忙。

I want to set the current date of the day as picker open up for the first time..

IMO,那是因为以下几行:

m_calendar.set(Calendar.DAY_OF_MONTH, month);
m_calendar.set(Calendar.MONTH, day);
m_calendar.set(Calendar.YEAR, year);

应该是这样的:

m_calendar.set(Calendar.DAY_OF_MONTH, day);
m_calendar.set(Calendar.MONTH, month);
m_calendar.set(Calendar.YEAR, year);

或直接调用 m_calendar.set(year, month, day);

请注意,在 Calendar.java 文件中:

public static final int JANUARY = 0;
public static final int FEBRUARY = 1;
...

所以如果你想要FEBRUARY,你应该使用m_calendar.set(1, month, day);m_calendar.set(Calendar.FEBRUARY, month, day);。换句话说,如果您调用 openDatePicker(3, 20, 2015); DatePicker 将显示日期 April 20, 2015.

希望对您有所帮助!