我想显示日期选择器弹出窗口。我找到了一些例子,但我没有得到正确的。我有一个edittext,我希望当我点击edittext时,datepicker对话框应该弹出,设置日期后,日期应该显示在edittext在dd/mm/yyyy格式。请为我提供示例代码或良好的链接。


当前回答

试试这个:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

DataPickerListener listener;

public DatePickerFragment(DataPickerListener l) {
    listener = l;
}

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

    return new DatePickerDialog(getActivity(),
            AlertDialog.THEME_HOLO_LIGHT, this, year, month, day);
}

public void onDateSet(DatePicker view, int year, int month, int day) {

    month = month + 1;
    String stringOfDate = day + "-" + month + "-" + year;
    listener.setDate(stringOfDate);
    Util.Log(stringOfDate);
}

@Override
public void onCancel(DialogInterface dialog) {
    // TODO Auto-generated method stub
    super.onCancel(dialog);
    listener.cancel();
}

public static interface DataPickerListener {
    void setDate(String date);

    void cancel();
}
}
// use this function to open datePicker popup

DialogFragment newFragment;

public void pickDate() {
    if (newFragment == null)
        newFragment = new DatePickerFragment(new PickDateListener());
    newFragment.show(getFragmentManager(), "Date Picker");
}

class PickDateListener implements DataPickerListener {

    @Override
    public void setDate(String date) {
        createSpiner(date);
        onetouch = false;
    }

    @Override
    public void cancel() {
        onetouch = false;
    }

}

其他回答

editText。setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(final View v) {
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);


        final DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
                new DatePickerDialog.OnDateSetListener() {
                    String fmonth, fDate;
                    int month;


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


                        try {
                            if (monthOfYear < 10 && dayOfMonth < 10) {

                                fmonth = "0" + monthOfYear;
                                month = Integer.parseInt(fmonth) + 1;
                                fDate = "0" + dayOfMonth;
                                String paddedMonth = String.format("%02d", month);
                                editText.setText(fDate + "/" + paddedMonth + "/" + year);

                            } else {

                                fmonth = "0" + monthOfYear;
                                month = Integer.parseInt(fmonth) + 1;
                                String paddedMonth = String.format("%02d", month);
                                editText.setText(dayOfMonth + "/" + paddedMonth + "/" + year);
                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                        }


                    }

                }, mYear, mMonth, mDay);
        datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
        datePickerDialog.show();


    }


});

用这个简单的技巧来做吧:

步骤1:创建一个片段对话框

public class DatePickerFragmentDialog  extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener) getActivity(), year, month, day);
    }

}

第二步:在必要的活动中遵循这一点

该活动必须实现:DatePickerDialog。OnDateSetListener 在按钮上设置onClickListener: DialogFragment datePicker = new DatePickerFragmentDialog(); datePicker.show(getSupportFragmentManager(), "自定义日期选择器");

步骤3:覆盖OnDateSetListener

public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

        @SuppressLint("SimpleDateFormat") DateFormat dateFormat = new 
        SimpleDateFormat("MM/dd/yyyy");
        String currentDateString = dateFormat.format(calendar.getTime());

        tvPaymentDate.setText(currentDateString);
    }

因此,我们可以使用任何格式的日期:)

我不能得到这些工作中的任何人,所以将添加我的一个,以防它有帮助。

public class MyEditTextDatePicker  implements OnClickListener, OnDateSetListener {   
EditText _editText;
private int _day;
private int _month;
private int _birthYear;
private Context _context;

public MyEditTextDatePicker(Context context, int editTextViewID)
{       
    Activity act = (Activity)context;
    this._editText = (EditText)act.findViewById(editTextViewID);
    this._editText.setOnClickListener(this);
    this._context = context;
}

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    _birthYear = year;
    _month = monthOfYear;
    _day = dayOfMonth;
    updateDisplay();
}
@Override
public void onClick(View v) {
    Calendar calendar = Calendar.getInstance(TimeZone.getDefault());

    DatePickerDialog dialog = new DatePickerDialog(_context, this,
            calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH));
    dialog.show();
    
}

// updates the date in the birth date EditText
private void updateDisplay() {

    _editText.setText(new StringBuilder()
    // Month is 0 based so add 1
    .append(_day).append("/").append(_month + 1).append("/").append(_birthYear).append(" "));
}
}

还有其他书里没有提到的东西。确保将以下内容放在EditText xml上。

android:focusable="false"

否则,就像在我的例子中,键盘会不断弹出。

如果你需要一个单一的功能,所有的活动,当调用将打开日期选择器,然后返回我选择的日期,然后为所有创建一个接口

public interface OnDatePickerLitionarCallBack {

    void DatePicker(String selectedDate);
}

然后在活动中调用接口

 public class MapsActivity extends FragmentActivity implements OnDatePickerLitionarCallBack {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        findViewById(R.id.date_pick).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                date_Picker(MapsActivity.this,MapsActivity.this);
            }
        });
    }
     @Override
        public void DatePicker(String selectedDate) {
        
    
        }
    }

实现接口后,创建一个公共类用于访问任何活动或片段

public class Commons{

    public static void date_Picker(Context context, OnDatePickerLitionarCallBack onDatePickerLitionarCallBack) {
        final java.util.Calendar myCalendar = java.util.Calendar.getInstance();

        DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                  int dayOfMonth) {
                // TODO Auto-generated method stub
                myCalendar.set(java.util.Calendar.YEAR, year);
                myCalendar.set(java.util.Calendar.MONTH, monthOfYear);
                myCalendar.set(java.util.Calendar.DAY_OF_MONTH, dayOfMonth);
                String myFormat = "dd,MMM yyyy"; //In which you need put here
                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(myFormat, Locale.US);
   
                onDatePickerLitionarCallBack.DatePicker(sdf.format(myCalendar.getTime()));

            }
        };
        DatePickerDialog datePickerDialog = new DatePickerDialog(context, date, myCalendar
                .get(java.util.Calendar.YEAR), myCalendar.get(java.util.Calendar.MONTH),
                myCalendar.get(java.util.Calendar.DAY_OF_MONTH));


        datePickerDialog.show();

    }
}

选中的答案不太适合我,因为我必须点击EditText框一次,然后在OnClickListener启动之前再次点击它。我能够通过用OnTouchListener替换OnClickListener来修复这个问题,以防有人遇到类似的问题,下面是我的代码看起来是什么样的:

Calendar myCalendar = Calendar.getInstance();

DatePickerDialog.OnDateSetListener date = new 
DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        // TODO Auto-generated method stub
        myCalendar.set(Calendar.YEAR, year);
        myCalendar.set(Calendar.MONTH, monthOfYear);
        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        updateLabel();
    }

};
edittext.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public void onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            new DatePickerDialog(classname.this, date, myCalendar
                    .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                    myCalendar.get(Calendar.DAY_OF_MONTH)).show();
        }
    }
});

private void updateLabel() {

    String myFormat = "MM/dd/yy"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

    edittext.setText(sdf.format(myCalendar.getTime()));
}