Android Date Picker Fragment 不能设置为自定义日期

Posted

技术标签:

【中文标题】Android Date Picker Fragment 不能设置为自定义日期【英文标题】:Android Date Picker Fragment can not be set to Custom date 【发布时间】:2018-10-05 12:27:08 【问题描述】:

在“图像按钮”上的“onClickListner”中,我的自定义“DatePickerFragment”正在显示以选择日期。以下是

的代码

DatePickerFragment.java

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.widget.DatePicker;

import java.util.Calendar;

/**
 * Created by Admin on 9/4/18.
 */
public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener 

    private onDatePickerListener mListener;
    private boolean future;

    public DatePickerFragment()

    

//    public DatePickerFragment(boolean future)
//        this.future=future;
//    

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);

        Log.d("DATE_PICKER", " CURRENT_MONTH " + month);

        int day = c.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), R.style.AppBaseTheme,this, year, month, day);

        if(isFuture() ==false)
            datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
        
        // Create a new instance of DatePickerDialog and return it
        return datePickerDialog;
    

    public void onDateSet(DatePicker view, int year, int month, int day) 
        // Do something with the date chosen by the user
        callListener(year, month, day);
    

    public DialogFragment setCallbackListener(onDatePickerListener listener) 
        mListener = listener;
        return null;
    

    private void callListener(int year, int month, int day) 
        if (mListener != null) mListener.onDataSet(year, month, day);
    

    public boolean isFuture() 
        return future;
    

    public void setFuture(boolean future) 
        this.future = future;
    

    public interface onDatePickerListener 
        void onDataSet(int year, int month, int day);
    

然后,当单击“DatePickerFragment”中的“确定”按钮时,我在“MainActivity”中调用此“片段”以将日期设置为“EditText”。

MainActivity.java

import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.sample.DatePickerFragment;

public class AddInterestedKarmaActivity extends AppCompatActivity    

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_interested_karma);

        ButterKnife.bind(this);
        context = this;

        EditText dateEdittext = (Edittext)findViewById(R.id.date_edit);
        setDate(dateEditText);

        

    private void setDate(final EditText dateEditText)

            datePickerFragment.setCallbackListener(new DatePickerFragment.onDatePickerListener() 
                @Override
                public void onDataSet(int year, int month, int day) 

                    int currentMonth = 0;

                    if (month == 0) 
                        currentMonth = 1;
                     else if (month == 1) 
                        currentMonth = 2;
                     else if (month == 2) 
                        currentMonth = 3;
                     else if (month == 3) 
                        currentMonth = 4;
                     else if (month == 4) 
                        currentMonth = 5;
                     else if (month == 5) 
                        currentMonth = 6;
                     else if (month == 6) 
                        currentMonth = 7;
                     else if (month == 7) 
                        currentMonth = 8;
                     else if (month == 8) 
                        currentMonth = 9;
                     else if (month == 9) 
                        currentMonth = 10;
                     else if (month == 10) 
                        currentMonth = 11;
                     else if (month == 11) 
                        currentMonth = 12;
                     else if (month == 12) 

                    

                    dateEditText.setText(day + "/" + currentMonth + "/" + year);

                
            );

        

        DialogFragment datePicker = datePickerFragment;

        datePicker.show(getSupportFragmentManager(), "datePicker");
    

    private void setTime(final EditText timeEditText)

        final Calendar c = Calendar.getInstance();
        mHour = c.get(Calendar.HOUR_OF_DAY);
        mMinute = c.get(Calendar.MINUTE);

        TimePickerDialog timePickerDialog = new TimePickerDialog(context,
                new TimePickerDialog.OnTimeSetListener() 

                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay,
                                          int minute) 

                        String curTime = String.format("%02d:%02d", hourOfDay, minute);
                        timeEditText.setText(curTime);
                    
                , mHour, mMinute, false);

        timePickerDialog.show();
    

我需要将“DatePickerFragmenet”的日期设置为自定义日期(不是今天)。例如将 'DatePickerFragment' onCreate() 设置为上述来自 'dateEditText' 的最终 int y、m、d 值。而且我还需要将自定义“时间”设置为“TimePickerDialog”,例如“DatePickerFragment”。

【问题讨论】:

您好心好几个月来写这些条件。我感谢你的努力。但是您可以简单地将 1 添加到 month @Amrish Kakadiya,我需要在第二次在屏幕上显示 DatePickerFragment 时的 EditText.getText().toString() 值。 【参考方案1】:

DatePickerDialog中有一个函数可以设置自定义日期(updateDate(year_, month_, day_))

根据您的代码,您需要在DatePickerFragment 中进行更改 在onCreateDialogDatePickerFragment 中,您从日历中获取datemonthyear,而不是从Calendar 获取,提供您的自定义日期。

更新的类在下面

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener 

    private onDatePickerListener mListener;
    private boolean future;
    int day_;
    int month_;
    int year_;
    private DatePickerDialog datePickerDialog;


    public DatePickerFragment() 

    


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        // Use the current date as the default date in the picker
//        final Calendar c = Calendar.getInstance();
//        int year = c.get(Calendar.YEAR);
//        int month = c.get(Calendar.MONTH);

        //    Log.d("DATE_PICKER", " CURRENT_MONTH " + month);

        //   int day = c.get(Calendar.DAY_OF_MONTH);
        datePickerDialog = new DatePickerDialog(getActivity(), R.style.AppTheme, this, year_, month_, day_);

        if (isFuture() == false) 
            datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
        
      //  datePickerDialog.updateDate(year_, month_, day_);

        // Create a new instance of DatePickerDialog and return it
        return datePickerDialog;
    


    public void onDateSet(DatePicker view, int year, int month, int day) 
        // Do something with the date chosen by the user
        callListener(year, month, day);
    

    public DialogFragment setCallbackListener(onDatePickerListener listener) 
        mListener = listener;
        return null;
    

    private void callListener(int year, int month, int day) 
        if (mListener != null) mListener.onDataSet(year, month, day);
    

    public boolean isFuture() 
        return future;
    

    public void setFuture(boolean future) 
        this.future = future;
    

    public interface onDatePickerListener 
        void onDataSet(int year, int month, int day);
    

在您的活动中,您需要提供自定义日期。 更新活动如下,您可以添加您的自定义日期。

public class AddInterestedKarmaActivity extends AppCompatActivity 

    DatePickerFragment datePickerDialog;
    EditText dateEdittext;
    String customDate = "12/12/2007"; //dd/mm/yy

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_interested_karma);


        dateEdittext = (EditText) findViewById(R.id.date_edit);
        //  setDate(dateEditText);


        datePickerDialog = new DatePickerFragment();
        datePickerDialog.day_ = getDay();
        datePickerDialog.month_ = getMonth();
        datePickerDialog.year_ = getYear();

        datePickerDialog.setCallbackListener(new DatePickerFragment.onDatePickerListener() 
                                                 @Override
                                                 public void onDataSet(int year, int month, int day) 
                                                     month = month + 1;
                                                     dateEdittext.setText(day + "/" + month + "/" + year);

                                                 
                                             
        );

        datePickerDialog.show(getSupportFragmentManager(), "datePicker");

    

    private int getYear() 
        return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "YYYY"));

    

    private int getMonth() 
        return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "MM")) - 1;  //substract one from month because month gets start from 0 in Calendar.

    

    private int getDay() 
        return Integer.parseInt(changeDateFormat(customDate, "MM/dd/yyyy", "dd"));
    


    public String changeDateFormat(String dateString, String sourceDateFormat, String targetDateFormat) 
        if (dateString == null || dateString.isEmpty())
            return "";

        SimpleDateFormat inputDateFromat = new SimpleDateFormat(sourceDateFormat, Locale.US);
        Date date = new Date();

        try 
            date = inputDateFromat.parse(dateString);
         catch (ParseException e) 
            e.printStackTrace();
        

        SimpleDateFormat outputDateFormat = new SimpleDateFormat(targetDateFormat, Locale.US);

        return outputDateFormat.format(date);
    



【讨论】:

我做了更改,但在活动中 datePickerDialog.year_ = getYear 显示与月份和日期相同的错误。因此我无法设置日期。然后 datePickerDialog onCreate 不显示任何选择。 感谢您为我提供解决方案。主要是我需要将自定义日期设置为 datePickerDialog。因为我从数据库中检索日期并将其分配给 EditText。之后,我需要在 DatePickerDialog 上显示该日期。 datePickerDialog.day_ = getDay(); datePickerDialog.month_ = getMonth(); datePickerDialog.year_ = getYear();是显示错误的行。 在 AddInterestedKarmaActivity 中我采用了一个变量 customDate,您可以将数据库中的日期分配给该变量。关于您遇到的错误,getDay()、getMonth() 和 getYear() 是我在同一活动中创建的方法。您只需要复制这两个类并粘贴到您的代码中。如果仍然有任何错误,请告诉我对您有帮助。 其实是DatePickerFragment报错,因为没有初始化public int getDay_() return day_; 公共无效 setDay_(int day_) this.day_ = day_; public int getMonth_() 返回月份_; public void setMonth_(int month_) this.month_ = month_; public int getYear_() return year_; public void setYear_(int year_) this.year_ = year_;现在我纠正了这个问题,现在它工作得很好。非常感谢您的帮助。 您是否在 DatePickerFragment 片段中进行了上述更改?

以上是关于Android Date Picker Fragment 不能设置为自定义日期的主要内容,如果未能解决你的问题,请参考以下文章

防止在 react-date-picker 中突出显示 Today

将 kendo-date-picker 限制为月和年

element-ui date-picker无法通过value绑值的取巧解决方案

ngChange 不适用于 kendo.toolbarOptions 中定义的 kendo-date-picker

EXTJS 6 - 日期控件 Date picker 只选年月

el-date-picker 选择日期后 数据更新但是视图不更新