我想显示日期选择器弹出窗口。我找到了一些例子,但我没有得到正确的。我有一个edittext,我希望当我点击edittext时,datepicker对话框应该弹出,设置日期后,日期应该显示在edittext在dd/mm/yyyy格式。请为我提供示例代码或良好的链接。
当前回答
我不能得到这些工作中的任何人,所以将添加我的一个,以防它有帮助。
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 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);
下面是Material Date Picker的Kotlin扩展函数:
fun TextInputEditText.datePicker(fm:FragmentManager, tag: String) {
isFocusableInTouchMode = false
isClickable = true
isFocusable = false
val datePicker =
MaterialDatePicker.Builder.datePicker()
.setTitleText("Select Date")
.build()
setOnClickListener {
datePicker.show(fm,"tag")
}
datePicker.addOnPositiveButtonClickListener {
setText(datePicker.headerText)
Log.d("TAG", "datePicker: \n $it")
}}
用法:
在活动:
yourTextInputEditText.datePicker(supportFragmentManager,"tag")
在片段:
yourTextInputEditText.datePicker(requireActivity().supportFragmentManager,"tag")
试试这个:
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;
}
}
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));
editText。setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
final DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
new DatePickerDialog.OnDateSetListener() {
String fmonth, fDate;
int month;
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
try {
if (monthOfYear < 10 && dayOfMonth < 10) {
fmonth = "0" + monthOfYear;
month = Integer.parseInt(fmonth) + 1;
fDate = "0" + dayOfMonth;
String paddedMonth = String.format("%02d", month);
editText.setText(fDate + "/" + paddedMonth + "/" + year);
} else {
fmonth = "0" + monthOfYear;
month = Integer.parseInt(fmonth) + 1;
String paddedMonth = String.format("%02d", month);
editText.setText(dayOfMonth + "/" + paddedMonth + "/" + year);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, mYear, mMonth, mDay);
datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
datePickerDialog.show();
}
});
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 碎片中的onCreateOptionsMenu
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- DSL元素android.dataBinding。enabled'已过时,已被'android.buildFeatures.dataBinding'取代
- ConstraintLayout:以编程方式更改约束
- PANIC: AVD系统路径损坏。检查ANDROID_SDK_ROOT值
- 如何生成字符串类型的buildConfigField
- Recyclerview不调用onCreateViewHolder
- Android API 21工具栏填充
- Android L中不支持操作栏导航模式
- 如何在TextView中添加一个子弹符号?
- PreferenceManager getDefaultSharedPreferences在Android Q中已弃用
- 在Android Studio中创建aar文件