Android API 21+ DatePicker 无法隐藏字段

Posted

技术标签:

【中文标题】Android API 21+ DatePicker 无法隐藏字段【英文标题】:Android API 21+ DatePicker Can't Hide Fields 【发布时间】:2016-09-05 19:22:06 【问题描述】:

我试图在 AlertDialog 的 DatePicker 中仅显示月份中的某天和月份字段。在 API 21 以前的 API 上,我可以使用下面的代码来完成。但是当我尝试在 API21+ 中执行此操作时,“getDeclaredFields()”甚至不会像“mYearPicker”或“mYearSpinner”字段那样返回。有谁知道如何我可以只显示日期和月份字段吗?我什至不知道“116”是什么字段。

我的代码是这样的:

 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+

有什么想法吗?

【问题讨论】:

嗯,为什么不 fork DatePicker 并修改它以适应它呢?或者,为什么不使用a third-party library?鉴于设备制造商可以更改 Android 内部结构,更不用说 Google 推出新的 Android 版本,是什么让您认为这种方法将适用于数千种 Android 设备型号? 似乎是***.com/questions/30789907/…的副本 @Morse 谢谢!!效果很好 【参考方案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 对象时调用此方法

【讨论】:

以上是关于Android API 21+ DatePicker 无法隐藏字段的主要内容,如果未能解决你的问题,请参考以下文章

Android:API 级别低于 21 的状态栏颜色更改

Android API 21+ DatePicker 无法隐藏字段

使用 Camera2(Android 版本 21)API 录制 60fps 视频

Android API 21 中的 Webview 为空白/白色

在android 5上设置ImageView colorFilter(api 21)

将 Android API 从 27 降级到 21 (KOTLIN) 后出错