【问题标题】:Android Date Picker Fragment can not be set to Custom dateAndroid Date Picker Fragment 不能设置为自定义日期
【发布时间】: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() 值。

标签: java android datepicker android-edittext timepicker


【解决方案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 片段中进行了上述更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多