Android DatePicker仅更改为“月”和“年”

我有一个DatePickerDialog,我只想查看月和年。 我怎样才能改变这个代码?

public void chooseDate2(View v) { new DatePickerDialog( act.this, d1, dateAndTime1.get(Calendar.YEAR) + 2, dateAndTime1.get(Calendar.MONTH), dateAndTime1.get(Calendar.DAY_OF_MONTH) ).show(); } private void updateLabel2() { scadenza.setText(fmtDateAndTime.format(dateAndTime1.getTime())); } DatePickerDialog.OnDateSetListener d1=new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { dateAndTime1.set(Calendar.YEAR, year); dateAndTime1.set(Calendar.MONTH, monthOfYear); dateAndTime1.set(Calendar.DAY_OF_MONTH, dayOfMonth); updateLabel2(); } }; 

谢谢

尝试下面的代码。 它会显示一个DatePicker只有年和月(没有一天)

 private DatePickerDialog createDialogWithoutDateField() { DatePickerDialog dpd = new DatePickerDialog(this, null, 2014, 1, 24); try { java.lang.reflect.Field[] datePickerDialogFields = dpd.getClass().getDeclaredFields(); for (java.lang.reflect.Field datePickerDialogField : datePickerDialogFields) { if (datePickerDialogField.getName().equals("mDatePicker")) { datePickerDialogField.setAccessible(true); DatePicker datePicker = (DatePicker) datePickerDialogField.get(dpd); java.lang.reflect.Field[] datePickerFields = datePickerDialogField.getType().getDeclaredFields(); for (java.lang.reflect.Field datePickerField : datePickerFields) { Log.i("test", datePickerField.getName()); if ("mDaySpinner".equals(datePickerField.getName())) { datePickerField.setAccessible(true); Object dayPicker = datePickerField.get(datePicker); ((View) dayPicker).setVisibility(View.GONE); } } } } } catch (Exception ex) { } return dpd; } 

这个方法返回一个dateselect器对话框。 所以,在你的button的onClick方法中添加下面的代码来显示你的对话框。

 createDialogWithoutDateField().show(); 

正如我最近自己偶然发现这个问题,我testing了这个post的多个解决scheme和类似的问题在Stackoverflow。

不幸的是,我发现没有工作的解决scheme,尤其是Android 5 +

我结束了实现我自己的简单DialogFragmentembedded两个NumberPickers。 这应该与从3.0及以上的所有版本兼容。

这里是代码:

  public class MonthYearPickerDialog extends DialogFragment { private static final int MAX_YEAR = 2099; private DatePickerDialog.OnDateSetListener listener; public void setListener(DatePickerDialog.OnDateSetListener listener) { this.listener = listener; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); Calendar cal = Calendar.getInstance(); View dialog = inflater.inflate(R.layout.date_picker_dialog, null); final NumberPicker monthPicker = (NumberPicker) dialog.findViewById(R.id.picker_month); final NumberPicker yearPicker = (NumberPicker) dialog.findViewById(R.id.picker_year); monthPicker.setMinValue(1); monthPicker.setMaxValue(12); monthPicker.setValue(cal.get(Calendar.MONTH) + 1); int year = cal.get(Calendar.YEAR); yearPicker.setMinValue(year); yearPicker.setMaxValue(MAX_YEAR); yearPicker.setValue(year); builder.setView(dialog) // Add action buttons .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { listener.onDateSet(null, yearPicker.getValue(), monthPicker.getValue(), 0); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MonthYearPickerDialog.this.getDialog().cancel(); } }); return builder.create(); } } 

和布局

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal"> <NumberPicker android:id="@+id/picker_month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="20dp" android:layout_marginRight="20dp"> </NumberPicker> <NumberPicker android:id="@+id/picker_year" android:layout_width="wrap_content" android:layout_height="wrap_content"> </NumberPicker> </LinearLayout> </LinearLayout> 

要显示布局使用:

 MonthYearPickerDialog pd = new MonthYearPickerDialog(); pd.setListener(this); pd.show(getFragmentManager(), "MonthYearPickerDialog"); 

我不build议使用reflection做这种事情。

有一个更简单,更漂亮的方法来做到这一点:

 ((ViewGroup) datePickerDialog.getDatePicker()).findViewById(Resources.getSystem().getIdentifier("day", "id", "android")).setVisibility(View.GONE); 

请注意, DatePickerDialog中的.getDatePicker()方法在API LEVEL >= 11

另外它在API LEVEL> = 21上不起作用。

Stephan Klein答案的更多提前forms。

因为我有一个要求使年任选 。 而且我也处理了像2月28日的date,也处理闰年

MonthYearPickerDialog

 public class MonthYearPickerDialog extends DialogFragment { private DatePickerDialog.OnDateSetListener listener; private int daysOfMonth = 31; private NumberPicker monthPicker; private NumberPicker yearPicker; private NumberPicker dayPicker; private Calendar cal = Calendar.getInstance(); public static final String MONTH_KEY = "monthValue"; public static final String DAY_KEY = "dayValue"; public static final String YEAR_KEY = "yearValue"; int monthVal = -1 , dayVal = -1 , yearVal =-1 ; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getArguments(); if(extras != null){ monthVal = extras.getInt(MONTH_KEY , -1); dayVal = extras.getInt(DAY_KEY , -1); yearVal = extras.getInt(YEAR_KEY , -1); } } public static MonthYearPickerDialog newInstance(int monthIndex , int daysIndex , int yearIndex) { MonthYearPickerDialog f = new MonthYearPickerDialog(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt(MONTH_KEY, monthIndex); args.putInt(DAY_KEY, daysIndex); args.putInt(YEAR_KEY, yearIndex); f.setArguments(args); return f; } public void setListener(DatePickerDialog.OnDateSetListener listener) { this.listener = listener; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { //getDialog().setTitle("Add Birthday"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); View dialog = inflater.inflate(R.layout.month_year_picker, null); monthPicker = (NumberPicker) dialog.findViewById(R.id.picker_month); yearPicker = (NumberPicker) dialog.findViewById(R.id.picker_year); dayPicker = (NumberPicker) dialog.findViewById(R.id.picker_day); monthPicker.setMinValue(1); monthPicker.setMaxValue(12); if(monthVal != -1)// && (monthVal > 0 && monthVal < 13)) monthPicker.setValue(monthVal); else monthPicker.setValue(cal.get(Calendar.MONTH) + 1); monthPicker.setDisplayedValues(new String[]{"Jan","Feb","Mar","Apr","May","June","July", "Aug","Sep","Oct","Nov","Dec"}); dayPicker.setMinValue(1); dayPicker.setMaxValue(daysOfMonth); if(dayVal != -1) dayPicker.setValue(dayVal); else dayPicker.setValue(cal.get(Calendar.DAY_OF_MONTH)); monthPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { switch (newVal){ case 1:case 3:case 5: case 7:case 8:case 10: case 12: daysOfMonth = 31; dayPicker.setMaxValue(daysOfMonth); break; case 2: daysOfMonth = 28; dayPicker.setMaxValue(daysOfMonth); break; case 4:case 6: case 9:case 11: daysOfMonth = 30; dayPicker.setMaxValue(daysOfMonth); break; } } }); int maxYear = cal.get(Calendar.YEAR);//2016 final int minYear = 1916;//1997; int arraySize = maxYear - minYear; String[] tempArray = new String[arraySize]; tempArray[0] = "---"; int tempYear = minYear+1; for(int i=0 ; i < arraySize; i++){ if(i != 0){ tempArray[i] = " " + tempYear + ""; } tempYear++; } Log.i("", "onCreateDialog: " + tempArray.length); yearPicker.setMinValue(minYear+1); yearPicker.setMaxValue(maxYear); yearPicker.setDisplayedValues(tempArray); if(yearVal != -1) yearPicker.setValue(yearVal); else yearPicker.setValue(tempYear -1); yearPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { try { if(isLeapYear(picker.getValue())){ daysOfMonth = 29; dayPicker.setMaxValue(daysOfMonth); } }catch (Exception e){ e.printStackTrace(); } } }); builder.setView(dialog) // Add action buttons .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { int year = yearPicker.getValue(); if(year == (minYear+1)){ year = 1904; } listener.onDateSet(null, year, monthPicker.getValue(), dayPicker.getValue()); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MonthYearPickerDialog.this.getDialog().cancel(); } }); return builder.create(); } public static boolean isLeapYear(int year) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365; } } 

我称之为

 Calendar calendar = Calendar.getInstance(); if(etBirthday.getText().length()> 0 ){ if(checkIsYearAvailable(etBirthday.getText().toString().trim())) calendar = DateTimeOp.getCalendarFromFormat(etBirthday.getText().toString().trim(), Constants.dateFormat21); else calendar = DateTimeOp.getCalendarFromFormat(etBirthday.getText().toString().trim() + ", 1917",Constants.dateFormat21); } MonthYearPickerDialog pd = MonthYearPickerDialog.newInstance(calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH),calendar.get(Calendar.YEAR)); pd.setListener(new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { String formatedDate = ""; if(selectedYear == 1904) { String currentDateFormat = selectedMonth + "/" + selectedDay;// + "/" + selectedYear; //"MM/dd/yyyy" formatedDate = DateTimeOp.oneFormatToAnother(currentDateFormat, Constants.dateFormat20, Constants.dateFormat24); } else{ String currentDateFormat = selectedMonth + "/" + selectedDay + "/" + selectedYear; //"MM/dd/yyyy" formatedDate = DateTimeOp.oneFormatToAnother(currentDateFormat, Constants.dateFormat0, Constants.dateFormat21); } etBirthday.setText(formatedDate); } }); pd.show(getFragmentManager(), "MonthYearPickerDialog"); 

month_year_picker.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal"> <NumberPicker android:id="@+id/picker_month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="20dp" android:layout_marginRight="20dp" /> <NumberPicker android:id="@+id/picker_day" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="20dp" android:layout_marginRight="20dp" /> <NumberPicker android:id="@+id/picker_year" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> 

这是一个老问题,但现在你可以使用“BetterPickers”:

https://github.com/code-troopers/android-betterpickers

并使用ExpirationPicker。

希望这解决了一些其他失踪的灵魂search谷歌广泛。