2016-05-10 49 views
-1

我想在AlertDialog中的DatePicker中只显示月份和月份字段的一天。在API 21以前的API中,我可以用下面的代码来完成它。但是当我尝试在API21 +“getDeclaredFields()”中执行时,它甚至不会像“mYearPicker”或“mYearSpinner”字段那样返回。是否有人知道如何我可以只显示日期和月份字段吗?我甚至不知道字段“116”是什么。Android API 21+ DatePicker不能隐藏字段

我这样的代码:

final DatePicker datePickerStart = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar)); 
    datePickerStart .setCalendarViewShown(false); 
    datePickerStart .setSpinnersShown(true); 
    try { 
     Field f[] = datePickerStart .getClass().getDeclaredFields(); 
     for (Field field : f) { 
      if (field.getName().equals("mYearPicker")|| field.getName().equals("mYearSpinner")) { 
       field.setAccessible(true); 
       Object yearPicker = new Object(); 
       yearPicker = field.get(datePickerStart); 
       ((View) yearPicker).setVisibility(View.GONE); 
      } 
     } 
    } 
    catch (Exception e) { 
     Log.e("ERROR", e.getMessage()); 
    } 

应该像这样: Before API 21

是这样的: API 21+

任何想法?

+0

嗯,为什么不叉'DatePicker'并对其进行修改,以适应?或者,为什么不使用[第三方库](http://android-arsenal.com/tag/27)?考虑到设备制造商可以改变Android内部结构,更不用说谷歌拥有新的Android版本,是什么让你认为这种方法可以在数千款Android设备上运行? – CommonsWare

+0

似乎像http://stackoverflow.com/questions/30789907/hide-day-month-or-year-from-datepicker-in-android-5-0-lollipop – Morse

+0

@Morse谢谢你的重复!它运作良好 – Goktug

回答

-1

由于@Morse我找到了解决办法HERE

public DatePicker initMonthPicker(){ 
    DatePicker dp_mes = new DatePicker(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar)); 

    int year = dp_mes.getYear(); 
    int month = dp_mes.getMonth(); 
    int day  = dp_mes.getDayOfMonth(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
     int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android"); 
     if (daySpinnerId != 0) 
     { 
      View daySpinner = dp_mes.findViewById(daySpinnerId); 
      if (daySpinner != null) 
      { 
       daySpinner.setVisibility(View.VISIBLE); 
      } 
     } 

     int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android"); 
     if (monthSpinnerId != 0) 
     { 
      View monthSpinner = dp_mes.findViewById(monthSpinnerId); 
      if (monthSpinner != null) 
      { 
       monthSpinner.setVisibility(View.VISIBLE); 
      } 
     } 

     int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android"); 
     if (yearSpinnerId != 0) 
     { 
      View yearSpinner = dp_mes.findViewById(yearSpinnerId); 
      if (yearSpinner != null) 
      { 
       yearSpinner.setVisibility(View.GONE); 
      } 
     } 
    } else { //Older SDK versions 
     Field f[] = dp_mes.getClass().getDeclaredFields(); 
     for (Field field : f) 
     { 
      if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
      { 
       field.setAccessible(true); 
       Object dayPicker = null; 
       try { 
        dayPicker = field.get(dp_mes); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
       ((View) dayPicker).setVisibility(View.GONE); 
      } 

      if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
      { 
       field.setAccessible(true); 
       Object monthPicker = null; 
       try { 
        monthPicker = field.get(dp_mes); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
       ((View) monthPicker).setVisibility(View.VISIBLE); 
      } 

      if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
      { 
       field.setAccessible(true); 
       Object yearPicker = null; 
       try { 
        yearPicker = field.get(dp_mes); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
       ((View) yearPicker).setVisibility(View.GONE); 
      } 
     } 
    } 
    return dp_mes; 
} 

,所以我只是调用这个方法时,我需要一个新的DatePicker对象