Datepicker: วิธีการป๊อปอัป datepicker เมื่อคลิกที่ edittext


279

ฉันต้องการที่จะแสดงหน้าต่างป๊อปอัพ datepicker ฉันพบตัวอย่าง แต่ฉันไม่ได้รับอย่างถูกต้อง ฉันมีหนึ่ง edittext และฉันต้องการที่เมื่อฉันคลิกที่ edittext กล่องโต้ตอบ datepicker ควรปรากฏขึ้นและหลังจากการตั้งค่าวันที่วันที่ควรแสดงใน edittext ในรูปแบบวว / ดด / ปปปป โปรดให้รหัสตัวอย่างหรือลิงก์ที่ดีแก่ฉัน



หวังว่ามันจะช่วยให้หลาย edittext ด้วย gist.github.com/pratikbutani/036e73e26139096e3b0ba91f85e23d85
Pratik Butani

คำตอบ:


693

ลองในไฟล์ XML:

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

ตอนนี้ในไฟล์ Java:

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

ตอนนี้เพิ่มวิธีการในกิจกรรมข้างต้น

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 เพื่ออนุญาตให้กดเพียงครั้งเดียว


1
คุณบอกได้ไหมว่า new_split.this คืออะไร
JEMSHID56

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน :( ฉันมีข้อผิดพลาดฉันไม่ทราบวิธีการกำจัดด้วยวิธี
updateLabel

15
ใช้ editText.setOnFocusChangeListenerinstead, ทำงานเมื่อคลิกครั้งแรก
Daniel Jonker

44
ฉันได้แก้ไขสิ่งนี้ด้วยการใช้android:focusable="false"และonclicklistner
Prabs

12
อาจต้องการตั้งค่าandroid:longClickable="false"เช่นกัน มิฉะนั้นผู้ใช้สามารถนำตัวเลือกการวางบนฟิลด์ (และป้อนวันที่ไม่ถูกต้อง)
Kat

93

ไม่สามารถรับทุกคนที่ทำงานเหล่านี้ดังนั้นจะเพิ่มของฉันในกรณีที่มันช่วย

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"

อย่างอื่นเช่นในกรณีของฉัน Keyboard จะยังคงโผล่ขึ้นมา หวังว่านี่จะช่วยใครซักคน


@SatanEnglish - focuseable = "false" มีขนาดใหญ่มากที่นี่ โทรดีที่ฉันหวังว่าฉันจะ +5 คุณพูดถึงมัน
user2163298

2
น่ากลัว !! การเพิ่ม: จะไม่ทำงานสำหรับมุมมองชิ้นส่วน สำหรับข้อโต้แย้งการเปลี่ยนแปลงชิ้นส่วนคอนสตรัคเตอร์ให้กับวัตถุ EditText แทนที่จะเป็นรหัสทรัพยากร ..
blockwala

1
android: focusable = "false" ได้หลอกลวงสำหรับฉันขอบคุณมาก!
rochasdv

1
คำตอบของ Amazon ใช้งานได้เหมือนมีเสน่ห์
asifsid88

นี่คือสิ่งที่สวยงาม คำตอบที่ยอดเยี่ยม!
yUdoDis

23
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
ทำให้ onDateSet ไม่ได้ถูกเรียกภายใน On Click แต่ควรเรียกเมื่อทำการ จำกัด ออบเจ็กต์ callBack ซึ่งควรส่งผ่านเป็น paremetre ตัวที่สอง callBack = ใหม่ DatePickerDialog.OnDateSetListener () {@Override public void onDateSet (มุมมอง DatePicker, ปี, เดือน int) int dayOfMonth) {Toast.makeText (getApplicationContext (), ปี + "" + monthOfYear + "" + dayOfMonth, Toast.LENGTH_LONG) .show (); }};
erluxman

11

มีอีกวิธีที่นำมาใช้ใหม่ได้ดีขึ้นเช่นกัน:

สร้างคลาส:

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

1
ลายเซ็นของชั้นควรมีลักษณะclass setDate implements View.OnFocusChangeListener, DatePickerDialog.OnDateSetListener {อย่างไร:
stephen

ชั้น setDate ใช้ ViewOnFocusChangeListener, TimePickerDialog OnDateSetListener
Sumoanand

โซลูชันของคุณใช้ได้กับฉันโดยใช้ Fragment ฉันเปลี่ยน "this" เป็น "getContext ()"
Jason Williams

นอกจากนี้คุณต้องตั้งค่าตัวแปรส่วนตัวและตั้งค่าจากตัวสร้าง "บริบทส่วนบุคคล ctx;"
Jason Williams

นอกจากนี้ฉันมีปัญหาบางอย่างที่ปล่อยแป้นพิมพ์ ดังนั้นฉันจึงเพิ่ม "v.clearFocus ();" ภายในตัวจัดการ onFocusChange
Jason Williams

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

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

7

นี่คือวิธีที่ฉันทำ: คล้ายกับคำตอบที่เลือก แต่ใช้คลาสโต้ตอบแบบคงที่ดังนั้นจึงสามารถใช้ซ้ำได้มากขึ้นและใช้ 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");
            }
        }
    });

และไดอะล็อก 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
    }
}

7

คำตอบที่เลือกไม่ได้ผลสำหรับฉันเนื่องจากฉันต้องแตะกล่อง 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()));
}

1
ปัญหานี้สามารถแก้ไขได้โดยสิ่งนี้: editTextView.setFocusable (false);
NoLongerContributingToSE

7

# 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 หรือข้อความโดยตรงในมุมมองของคุณ


3

วิธีการแก้ปัญหาโดยใช้ชิ้นส่วน, 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;
            }
        }

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

            }

        });

ฉันไม่แน่ใจเกี่ยวกับมันอาจจะมีวิธีอื่นที่คุณสามารถแทนที่หรือคุณสามารถ concat
erluxman

ตัวเลือกสุดท้ายคือการเริ่มต้นปฏิทินด้วยปีเดือนและวันที่ได้รับและรับวันที่ในรูปแบบที่ต้องการ
erluxman

โอ้คุณสามารถใช้เมธอด String ส่วนตัว get2DigitValue (ค่า int) {return int> 9? int + "": "0" + int}
erluxman

3

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);
TextViewDatePicker editTextDatePicker = new TextViewDatePicker(context, myEditText, minDate, maxDate);
//TextViewDatePicker editTextDatePicker = new TextViewDatePicker(context, myEditText); //without min date, max date

3

ใช้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และonClick)

ภายในViewModel:

public void onDateEditTextClicked() {
    // do something
}

สิ่งนี้ใช้ได้กับทุกคนหรือไม่ ฉันลองใช้วิธีนี้ แต่ไม่ได้เรียกใช้เมธอด onClick แต่เมื่อฉันเขียน onClickListener แบบดั้งเดิมใน viewModel แสดงว่าทำงานได้
ASN

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

}

การใช้งาน:

  DatePickerHelper assessmentDueDateHelper = new DatePickerHelper(AssessmentsDetailActivity.this,
            (TextView) findViewById(R.id.assessmentDueDateEditText));

3

ใช้เทคนิคง่ายๆนี้เพื่อทำ:

ขั้นตอนที่ 1: สร้างไดอะล็อก FRAGMENT

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: กิจกรรมที่ต้องทำตามนี้

  1. กิจกรรมที่ต้องนำไปใช้: DatePickerDialogOnDateSetListener

  2. ตั้ง onClickListener บนปุ่ม:

    DialogFragment datePicker = new DatePickerFragmentDialog();
    datePicker.show(getSupportFragmentManager(), "Custom Date Picker");

ขั้นตอนที่ 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);
    }

ดังนั้นเราสามารถใช้การจัดรูปแบบใด ๆ สำหรับวันที่ :)


2

ฉันได้ลองทุกวิธีที่แนะนำ แต่พวกเขาทั้งหมดมีปัญหาของตัวเอง

ทางออกที่ดีที่สุดในความคิดของฉันคือการใช้เค้าโครงกรอบด้านล่าง:

<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


2

ฉันคิดว่าการแทนที่คลาส EditText จะดีกว่า ...

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 แทน ...

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

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

        }
    });

2

ใช้สิ่งนี้

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

2

พอร์ต Kotlin เรียกใช้ฟังก์ชัน setDatePicker

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

ลองสิ่งนี้

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

    });

1
จะเป็นประโยชน์หากมีคำอธิบายเกี่ยวกับคำตอบของคุณพร้อมกับตัวอย่างโค้ด
vladko

1

editText.setOnClickListener (ใหม่ ViewOnClickListener () {

    @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

ไดอะล็อกเลือกตัวเลือกวันที่

                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);
                    }
                },year,month,day);
                datePickerDialog.show();

0

ลองสิ่งนี้:

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

}

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

นอกจากนี้คุณยังสามารถตั้งค่าวันที่ขั้นต่ำและวันที่สูงสุดโดยคำสั่งเหล่านี้

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

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

หมายเหตุ: เพิ่มบรรทัดเหล่านี้ก่อน datepickerDialog.show (); คำสั่งคุณจะได้รับวันที่โดยสิ่งนี้ = 12/2/2017

ฉันหวังว่าคำตอบของฉันจะช่วย


0

สิ่งนี้ใช้ได้กับฉันในเดือนมกราคม 2020

ส่วน XML:

  <EditText
            android:id="@+id/etDOB"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:editable="false"
            android:ems="10"
            android:hint="Enter Your Date of Birth" />

ส่วนของ Java:

         final Calendar myCalendar = Calendar.getInstance();

         userDOBView  = (EditText)findViewById(R.id.etDOB);


    final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener(){
      @Override
      public void onDateSet(DatePicker view, int year, int monthOfYear, int  dayOfMonth) {
             myCalendar.set(Calendar.YEAR, year);
             myCalendar.set(Calendar.MONTH, monthOfYear);
             myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
             updateLabel();
      }
    };

    userDOBView.setOnTouchListener(new View.OnTouchListener(){
      @Override
      public boolean onTouch(View v, MotionEvent event){
       if(event.getAction() == MotionEvent.ACTION_DOWN){
         new DatePickerDialog("YourClassName".this, date, 
             myCalendar.get(Calendar.YEAR), 
             myCalendar.get(Calendar.MONTH),         
             myCalendar.get(Calendar.DAY_OF_MONTH)).show();
          }
          return true;
       }
    });
private void updateLabel() {
  String myFormat = "MM/dd/yyyy"; //In which you need put here
  SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

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

0

นี่คือฟังก์ชันส่วนขยาย Kotlin:

fun EditText.transformIntoDatePicker(context: Context, format: String, maxDate: Date? = null) {
    isFocusableInTouchMode = false
    isClickable = true
    isFocusable = false

    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)
            val sdf = SimpleDateFormat(format, Locale.UK)
            setText(sdf.format(myCalendar.time))
        }

    setOnClickListener {
        DatePickerDialog(
            context, datePickerOnDataSetListener, myCalendar
                .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
            myCalendar.get(Calendar.DAY_OF_MONTH)
        ).run {
            maxDate?.time?.also { datePicker.maxDate = it }
            show()
        }
    }
}

การใช้งาน:

ในกิจกรรม:

editText.transformIntoDatePicker(this, "MM/dd/yyyy")
editText.transformIntoDatePicker(this, "MM/dd/yyyy", Date())

ในส่วน:

editText.transformIntoDatePicker(requireContext(), "MM/dd/yyyy")
editText.transformIntoDatePicker(requireContext(), "MM/dd/yyyy", Date())

-1

ทางออกของฉันสำหรับ Xamarin.Android กับ MvvmCross ขึ้นอยู่กับ Linh's:

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

สำหรับรุ่นวานิลลา Xamarin.Android เพียงแทนที่ WeakSubscribe ด้วยการสมัครสมาชิกปกติของเหตุการณ์ EditText ของ Click โดยไม่ลืมที่จะยกเลิกการสมัครในแทนที่ Dispose method

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.