Datepicker: How to popup datepicker when click on edittext
我想显示datepicker弹出窗口。 我找到了一些例子,但我没有得到正确的答案。 我有一个edittext,我希望当我点击edittext时,应该弹出datepicker对话框,设置日期后,日期应该以dd / mm / yyyy格式显示在edittext中。 PLease为我提供示例代码或良好的链接。
在XML文件中尝试:
1 2 3 4 5 6 | <EditText android:id="@+id/Birthday" custom:font="@string/font_avenir_book" android:clickable="true" android:editable="false" android:hint="@string/birthday"/> |
现在在Java文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | final Calendar myCalendar = Calendar.getInstance(); EditText edittext= (EditText) findViewById(R.id.Birthday); 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.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub new DatePickerDialog(classname.this, date, myCalendar .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)).show(); } }); |
现在在上面的活动中添加方法。
1 2 3 4 5 6 | 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())); } |
在EditText的xml文件中添加
无法让这些人工作,所以将添加我的一个只是在它有帮助的情况下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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上。
1 | android:focusable="false" |
否则就像我的情况一样,键盘会不断弹出。
希望这有助于某人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyClass implements OnClickListener, OnDateSetListener { EditText editText; this.editText = (EditText) findViewById(R.id.editText); this.editText.setOnClickListener(this); @Override public void onClick(View v) { DatePickerDialog dialog = new DatePickerDialog(this, this, 2013, 2, 18); dialog.show(); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // this.editText.setText(); } } |
还有另一种更好的可重用方式:
创建一个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class setDate implements OnFocusChangeListener, OnDateSetListener { private EditText editText; private Calendar myCalendar; public setDate(EditText editText, Context ctx){ this.editText = editText; this.editText.setOnFocusChangeListener(this); myCalendar = Calendar.getInstance(); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // this.editText.setText(); String myFormat ="MMM dd, yyyy"; //In which you need put here SimpleDateFormat sdformat = new SimpleDateFormat(myFormat, Locale.US); myCalendar.set(Calendar.YEAR, year); myCalendar.set(Calendar.MONTH, monthOfYear); myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); editText.setText(sdformat.format(myCalendar.getTime())); } @Override public void onFocusChange(View v, boolean hasFocus) { // TODO Auto-generated method stub if(hasFocus){ new DatePickerDialog(ctx, this, myCalendar .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)).show(); } } } |
然后在onCreate函数下调用此类:
1 2 | EditText editTextFromDate = (EditText) findViewById(R.id.editTextFromDate); setDate fromDate = new setDate(editTextFromDate, this); |
这就是我这样做的方法:与所选答案类似,但使用静态对话框类,因此它更可重用,并且还使用onFocusChange而不是onClick。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { DialogFragment datePickerFragment = new DatePickerFragment() { @Override public void onDateSet(DatePicker view, int year, int month, int day) { Log.d(TAG,"onDateSet"); Calendar c = Calendar.getInstance(); c.set(year, month, day); editText.setText(df.format(c.getTime())); nextField.requestFocus(); //moves the focus to something else after dialog is closed } }; datePickerFragment.show(getActivity().getSupportFragmentManager(),"datePicker"); } } }); |
和datepicker对话框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ @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); int day = c.get(Calendar.DAY_OF_MONTH); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { //blah } } |
选择的答案对我来说并不适用,因为我必须点击EditText框一次,然后在OnClickListener触发之前再次点击它。我能够通过用OnTouchListener替换OnClickListener来解决这个问题,以防万一有人遇到类似的问题,这就是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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())); } |
#1。我想显示一个当前日期为预选的日期选择器(我使用黄油刀进行注射)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @OnClick(R.id.your_view) public void onClickYourView() { final 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); String myFormat ="dd MMMM yyyy"; // your format SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.getDefault()); your_view.setText(sdf.format(myCalendar.getTime())); } }; new DatePickerDialog(mContext, date, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)).show(); } |
2.如果要预先选择日期,请将最后一部分替换为
1 | new DatePickerDialog(mContext, date, 1990, 0, 1).show(); |
那么您可以使用myCalendar变量或直接使用视图中的文本来获取它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <EditText android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:hint="DD/MM/YYYY" android:inputType="date" android:focusable="false"/> <EditText android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="00:00" android:inputType="time" android:focusable="false"/> |
JAVA文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TimePicker; import java.util.Calendar; public class MainActivity extends AppCompatActivity implements View.OnClickListener { EditText selectDate,selectTime; private int mYear, mMonth, mDay, mHour, mMinute; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); selectDate=(EditText)findViewById(R.id.date); selectTime=(EditText)findViewById(R.id.time); selectDate.setOnClickListener(this); selectTime.setOnClickListener(this); } @Override public void onClick(View view) { if (view == selectDate) { final Calendar c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { selectDate.setText(dayOfMonth +"-" + (monthOfYear + 1) +"-" + year); } }, mYear, mMonth, mDay); datePickerDialog.show(); } if (view == selectTime) { // Get Current Time final Calendar c = Calendar.getInstance(); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Calendar.MINUTE); // Launch Time Picker Dialog TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { selectTime.setText(hourOfDay +":" + minute); } }, mHour, mMinute, false); timePickerDialog.show(); } } } |
我的班级为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import android.app.DatePickerDialog; import android.content.Context; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class TextViewDatePicker implements View.OnClickListener, DatePickerDialog.OnDateSetListener { public static final String DATE_SERVER_PATTERN ="yyyy-MM-dd"; private DatePickerDialog mDatePickerDialog; private TextView mView; private Context mContext; private long mMinDate; private long mMaxDate; public TextViewDatePicker(Context context, TextView view) { this(context, view, 0, 0); } public TextViewDatePicker(Context context, TextView view, long minDate, long maxDate) { mView = view; mView.setOnClickListener(this); mView.setFocusable(false); mContext = context; mMinDate = minDate; mMaxDate = maxDate; } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, monthOfYear); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); Date date = calendar.getTime(); SimpleDateFormat formatter = new SimpleDateFormat(DATE_SERVER_PATTERN); mView.setText(formatter.format(date)); } @Override public void onClick(View v) { Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); mDatePickerDialog = new DatePickerDialog(mContext, this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); if (mMinDate != 0) { mDatePickerDialog.getDatePicker().setMinDate(mMinDate); } if (mMaxDate != 0) { mDatePickerDialog.getDatePicker().setMaxDate(mMaxDate); } mDatePickerDialog.show(); } public DatePickerDialog getDatePickerDialog() { return mDatePickerDialog; } public void setMinDate(long minDate) { mMinDate = minDate; } public void setMaxDate(long maxDate) { mMaxDate = maxDate; } } |
运用
1 2 3 | EditText myEditText = findViewById(R.id.myEditText); TextViewDatePicker editTextDatePicker = new TextViewDatePicker(context, myEditText, minDate, maxDate); //TextViewDatePicker editTextDatePicker = new TextViewDatePicker(context, myEditText); //without min date, max date |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | selectDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatePickerDialog mdiDialog =new DatePickerDialog(mContext,new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Toast.makeText(getApplicationContext(),year+""+monthOfYear+""+dayOfMonth,Toast.LENGTH_LONG).show(); } }, year, month, date); mdiDialog.show(); } }); |
使用片段,MvvmCross和Xamarin.Android的解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | public class EnterTimeView : MvxFragment, DatePickerDialog.IOnDateSetListener { private EditText datePickerText; public EnterTimeView() { this.RetainInstance = true; } public override Android.Views.View OnCreateView(Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState) { this.HasOptionsMenu = true; var ignored = base.OnCreateView(inflater, container, savedInstanceState); var view = inflater.Inflate(Resource.Layout.EnterTimeView, container, false); datePickerText = view.FindViewById<EditText>(Resource.Id.DatePickerEditText); datePickerText.Focusable = false; datePickerText.Click += delegate { var dialog = new DatePickerDialogFragment(Activity, Convert.ToDateTime(datePickerText.Text), this); dialog.Show(FragmentManager,"date"); }; var set = this.CreateBindingSet<EnterTimeView, EnterTimeViewModel>(); set.Bind(datePickerText).To(vm => vm.Date); set.Apply(); return view; } public void OnDateSet(Android.Widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) { datePickerText.Text = new DateTime(year, monthOfYear + 1, dayOfMonth).ToString(); } private class DatePickerDialogFragment : Android.Support.V4.App.DialogFragment { private readonly Context _context; private DateTime _date; private readonly DatePickerDialog.IOnDateSetListener _listener; public DatePickerDialogFragment(Context context, DateTime date, DatePickerDialog.IOnDateSetListener listener) { _context = context; _date = date; _listener = listener; } public override Dialog OnCreateDialog(Bundle savedState) { var dialog = new DatePickerDialog(_context, _listener, _date.Year, _date.Month - 1, _date.Day); return dialog; } } |
使用DataBinding:
1 2 3 4 5 6 7 8 9 10 | <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:onClick="@{() -> viewModel.onDateEditTextClicked()}" android:hint="@string/hint_date" android:imeOptions="actionDone" android:inputType="none" android:maxLines="1" android:text="@={viewModel.filterDate}" /> |
(参见
在ViewModel中:
1 2 3 | public void onDateEditTextClicked() { // do something } |
我已经尝试了所有建议的方式,但他们都有自己的问题。
我认为最好的解决方案是使用如下框架布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" .... /> <View android:id="@+id/invisible_click_watcher" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </FrameLayout> |
然后添加在@Android的答案中精美编写的DatePickerDialog代码。
我认为最好覆盖EditText类......
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class EditTextDP extends android.support.v7.widget.AppCompatEditText implements View.OnClickListener, DatePickerDialog.OnDateSetListener { public EditTextDP(Context context) { super(context); setOnClickListener(this); setFocusable(false); } public EditTextDP(Context context, AttributeSet attrs) { super(context, attrs); setOnClickListener(this); setFocusable(false); } public EditTextDP(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOnClickListener(this); setFocusable(false); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { setText(new StringBuilder().append(dayOfMonth).append("/").append(monthOfYear + 1).append("/").append(year)); } @Override public void onClick(View v) { Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); DatePickerDialog dialog = new DatePickerDialog(getContext(), this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); dialog.show(); } } |
而在XML中使用它...
1 2 3 4 5 6 7 8 9 | <*.*.*.EditTextDP android:id="@+id/c1_dob_hm" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/round_edittext_white" android:ems="10" android:padding="8dp"> </*.*.*.EditTextDP> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import android.app.DatePickerDialog; import android.content.Context; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; public class DatePickerHelper { private final Calendar calendar = Calendar.getInstance(); private final String dateFormat ="MM/dd/yy"; private TextView textView = null; public DatePickerHelper(final Context context, TextView textView) { this.textView = textView; // Setup on click listener if the TextView is not null if (textView != null) { textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getDatePickerDialog(context).show(); } }); } } /** * Return a new date picker listener tied to the specified TextView field * @return */ private DatePickerDialog.OnDateSetListener getOnDateSetListener() { return new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, monthOfYear); calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US); textView.setText(sdf.format(calendar.getTime())); } }; } /** * Return new DatePickerDialog for field * @param context * @return */ private DatePickerDialog getDatePickerDialog(Context context) { return new DatePickerDialog(context, getOnDateSetListener(), calendar .get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); } } |
用法:
1 2 | DatePickerHelper assessmentDueDateHelper = new DatePickerHelper(AssessmentsDetailActivity.this, (TextView) findViewById(R.id.assessmentDueDateEditText)); |
使用这个简单的技术来做到这一点:
第1步:创建碎片对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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); } } |
第2步:按此要求进行活动
该活动必须实现:DatePickerDialog.OnDateSetListener
在Button上设置onClickListener:
1 2 | DialogFragment datePicker = new DatePickerFragmentDialog(); datePicker.show(getSupportFragmentManager(),"Custom Date Picker"); |
第3步:覆盖OnDateSetListener
1 2 3 4 5 6 7 8 9 10 11 12 | 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); } |
因此我们可以使用任何格式的日期:)
Kotlin端口,调用setDatePicker函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private fun setDatePicker(dateEditText: EditText) { val myCalendar = Calendar.getInstance() val datePickerOnDataSetListener = DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth -> myCalendar.set(Calendar.YEAR, year) myCalendar.set(Calendar.MONTH, monthOfYear) myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) updateLabel(myCalendar, dateEditText) } dateEditText.setOnClickListener { DatePickerDialog(this@YourActivityName, datePickerOnDataSetListener, myCalendar .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH)).show() } } private fun updateLabel(myCalendar: Calendar, dateEditText: EditText) { val myFormat: String ="dd-MMM-yyyy" val sdf = SimpleDateFormat(myFormat, Locale.UK) dateEditText.setText(sdf.format(myCalendar.time)) } |
试试这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | btn=(Button)findViewById(R.id.chs); final Dialog dialog = new Dialog(MainActivity.this); dialog.setCanceledOnTouchOutside(true); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.setContentView(R.layout.datepickerdialog); dp=(DatePicker) dialog.findViewById(R.id.btp); dialog.show(); ok=(Button)dialog.findViewById(R.id.btn1); ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); } }); |
editText.setOnClickListener(new View.OnClickListener(){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | @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 2 3 4 5 6 7 8 9 10 11 12 | Calendar c=Calendar.getInstance(); Integer month=c.get(Calendar.MONTH); Integer day=c.get(Calendar.DAY_OF_MONTH); Integer year=c.get(Calendar.YEAR); DatePickerDialog datePickerDialog =new DatePickerDialog(Expenture_Activity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { et_from.setText(dayOfMonth+"/"+month+"/"+year); } },day,month,year); datePickerDialog.show(); |
用这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | your_edittext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { final Calendar calendar = Calendar.getInstance(); int yy = calendar.get(Calendar.YEAR); int mm = calendar.get(Calendar.MONTH); int dd = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePicker = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { String date = String.valueOf(dayOfMonth) +"/" + String.valueOf(monthOfYear+1) +"/" + String.valueOf(year); your_edittext.setText(date); } }, yy, mm, dd); datePicker.show(); } }); |
不要忘记将
1 2 | android:clickable="true" android:focusable="false" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | public class DatePickerActivity extends AppCompatActivity { Button button; static TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button= (Button) findViewById(R.id.btn_click); textView= (TextView) findViewById(R.id.txt_date); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DialogFragment newFragment=new DatePickerFragment(); newFragment.show(getFragmentManager(),"datepicker"); } }); } public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int day) { String years=""+year; String months=""+(monthOfYear+1); String days=""+day; if(monthOfYear>=0 && monthOfYear<9){ months="0"+(monthOfYear+1); } if(day>0 && day<10){ days="0"+day; } textView.setText(days+"/"+months+"/"+years); } @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); int day=c.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog=null; datePickerDialog=new DatePickerDialog(getActivity(), this, year, month, day); return datePickerDialog; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | EditText text = (EditText) findViewById(R.id.editText); text.setOnClickListener(new OnClickListener(){ @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View view) { DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int i, int i1, int i2) { String date = i2 +"/" + (++i1) +"/" + i; text.setText(date); } },year,month,date); } }); datePickerDialog.show(); |
您还可以通过这些语句设置最短日期和最长日期。
1 2 3 | datepickerDialoge.getDatepicker().setMinDate(long Date); datepickerDialoge.getDatepicker().setMaxDate(long Date); |
注意:在datepickerDialog.show()之前添加这些行;声明
你会得到这样的日期= 12/2/2017。
我希望我的回答会有所帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | editText1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatePickerDialog.OnDateSetListener dpd = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { int s = monthOfYear + 1; String a = dayOfMonth +"/" + s +"/" + year; editText1.setText(a); } }; Time date = new Time(); DatePickerDialog d = new DatePickerDialog(UpdateStore.this, dpd, date.year, date.month, date.monthDay); d.show(); } }); |
如果您不想使用日期选择器逻辑搞乱您的活动或片段,并且只想打开日期选择器对话框并在所选日期之后获得回调,则可以在此处查看我的答案。
我的答案:当点击片段中的edittext时,如何弹出datepicker
我的解决方案Xamarin.Android与MvvmCross基于Linh的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | public class DatePickerEditText : EditText, DatePickerDialog.IOnDateSetListener { IDisposable _clickSubscription; public override bool Clickable => true; protected DatePickerEditText(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) => Init(); public DatePickerEditText(Context context) : base(context) => Init(); public DatePickerEditText(Context context, IAttributeSet attrs) : base(context, attrs) => Init(); public DatePickerEditText(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) => Init(); public DatePickerEditText(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes) => Init(); protected override void Dispose(bool disposing) { if (disposing) { _clickSubscription?.Dispose(); _clickSubscription = null; } base.Dispose(disposing); } public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth) => Text = view.DateTime.ToString("d", CultureInfo.CurrentUICulture); void Init() { SetFocusable(ViewFocusability.NotFocusable); _clickSubscription = this.WeakSubscribe(nameof(Click), OnClick); } void OnClick(object sender, EventArgs e) { var date = DateTime.Today; try { date = DateTime.Parse(Text, CultureInfo.CurrentUICulture); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } var dialog = new DatePickerDialog(Context, this, date.Year, date.Month, date.Day); dialog.Show(); } } |
对于一个vanilla Xamarin.Android版本,只需要定期订阅EditText的Click事件来替换WeakSubscribe,不要忘记在Dispose方法覆盖中取消订阅。
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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; } } |
对我来说很好
我在
1 | android:focusable="false" |