Datepicker: как всплывать datepicker при нажатии на edittext

Я хочу показать всплывающее окно datepicker. Я нашел несколько примеров, но я не получаю их должным образом. У меня есть один edittext, и я хочу, чтобы, когда я нажимаю на edittext, диалоговое окно datepicker должно появляться и после установки даты, дата должна отображаться в формате edittext в формате dd / mm / yyyy. PLease предоставит мне пример кода или хорошие ссылки.

Solutions Collecting From Web of "Datepicker: как всплывать datepicker при нажатии на edittext"

Попробуйте это в XML:

<EditText android:id="@+id/Birthday" custom:font="@string/font_avenir_book" android:clickable="true" android:editable="false" android:hint="@string/birthday"/> 

Теперь в файле Java:

 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(); } }); 

Теперь добавьте метод в вышеуказанную активность.

  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())); } 

Добавьте android:focusable="false" в xml-файле EditText, чтобы разрешить одно касание.

Не удалось заставить кого-либо из них работать, поэтому добавит мой, только в случае, если это поможет.

 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" 

В противном случае, как и в моем случае, клавиатура будет продолжать появляться. Надеюсь, это поможет кому-то

 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(); } } 

Существует еще один способ повторного использования:

Создайте класс:

 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:

  EditText editTextFromDate = (EditText) findViewById(R.id.editTextFromDate); setDate fromDate = new setDate(editTextFromDate, this); 

Вот как я это делаю: похоже на выбранный ответ, но используя статический класс диалога, чтобы его можно было повторно использовать, а также использовать onFocusChange вместо onClick.

 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"); } } }); 

И диалог даты.

 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 будет стрелять. Я смог исправить это, заменив OnClickListener на OnTouchListener, на всякий случай, когда кто-то столкнулся с подобной проблемой, вот мой код выглядит так:

 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())); } 

Раствор с использованием фрагментов, MvvmCross и Xamarin.Android

 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; } } 
  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(); } }); 

Я пробовал все, что было предложено, но у всех из них есть свои проблемы.

Лучшим решением, на мой взгляд, было бы использовать макет фрейма, как показано ниже:

 <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> 

А затем добавление кода DatePickerDialog, который был прекрасно написан в ответе @ Android.

# 1. Я хочу показать datepicker с текущей датой как предварительно выбранный (я использую butterknife для инъекций)

  @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. Если вы хотите предварительно выбрать дату, замените последнюю часть на

 new DatePickerDialog(mContext, date, 1990, 0, 1).show(); 

То вы можете получить его с помощью переменной myCalendar или непосредственно с текстом на вашем представлении.

Работаю отлично для меня

Я определяю в режиме EditText

 android:focusable="false" 
 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; } } } 

Использование DataBinding:

 <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}" /> 

(См. focusable , inputType и inputType )

Внутри ViewModel:

 public void onDateEditTextClicked() { // do something } 

Попробуй это:

 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 text=(EditText)findViewById(R.id.editText); text.setOnClickListener(new OnClickListener(){ @RequiresApi(api = Build.VERSION_CODES.N) @Override public void onClick(View view) { DatePickerDialoge datePickerDialog=new DatePickerDialog(MainActivity.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(); 

Вы также можете установить минимальную дату и максимальную дату этими заявлениями.

  datepickerDialoge.getDatepicker().setMinDate(long Date); datepickerDialoge.getDatepicker().setMaxDate(long Date); 

Примечание: добавьте эту строку до datepickerDiloge.show (); Вы получите дату следующим образом = 12/2/2017.

Надеюсь, мой ответ поможет.

Не забудьте установить атрибуты текста редактирования в следующем порядке:

 android:clickable="true" android:focusable="false" 

Мой класс для показа DatePicker . Я могу использовать для EditText , TextView или Button

 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; } } 

С помощью

 EditText myEditText = findViewById(R.id.myEditText); EditTextDatePicker editTextDatePicker = new EditTextDatePicker(getContext(), myEditText, minDate, AppUtils.DateTime.getCurrentTimeMillis());