Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android 5.0+中,从DatePicker中隐藏日期、月份或年份;棒棒糖_Android_Datepicker - Fatal编程技术网

在Android 5.0+中,从DatePicker中隐藏日期、月份或年份;棒棒糖

在Android 5.0+中,从DatePicker中隐藏日期、月份或年份;棒棒糖,android,datepicker,Android,Datepicker,我一直在寻找一个解决方案,以隐藏以下任何一个微调器的日期选择器。对于Android 5.0,内部变量发生了变化,在我的情况下,在我的设备更新后,日期和月份微调器再次可见 Android 4.4和Kitkat解决方案 DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate); // Initialize Date Picker int year = dpDate.getYear(); int month

我一直在寻找一个解决方案,以隐藏以下任何一个微调器的日期选择器。对于Android 5.0,内部变量发生了变化,在我的情况下,在我的设备更新后,日期和月份微调器再次可见

Android 4.4和Kitkat解决方案

DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

Field f[] = dpDate.getClass().getDeclaredFields();
            for (Field field : f) 
            {
                // Hides the DAY spinner
                if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
                {
                    field.setAccessible(true);
                    Object dayPicker = new Object();
                    dayPicker = field.get(dpDate);
                    ((View) dayPicker).setVisibility(View.GONE);
                }

                // Hides the MONTH spinner
                if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
                {
                    field.setAccessible(true);
                    Object monthPicker = new Object();
                    monthPicker = field.get(dpDate);
                    ((View) monthPicker).setVisibility(View.GONE);
                }

                // Hides the YEAR spinner
                if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
                {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(dpDate);
                    ((View) myearPicker).setVisibility(View.GONE);
                }
            }
    DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

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

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
                if (monthSpinnerId != 0) 
                {
                    View monthSpinner = dpDate.findViewById(monthSpinnerId);
                    if (monthSpinner != null) 
                    {
                        monthSpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
                if (yearSpinnerId != 0) 
                {
                    View yearSpinner = dpDate.findViewById(yearSpinnerId);
                    if (yearSpinner != null) 
                    {
                        yearSpinner.setVisibility(View.GONE);
                    }
                }
            }
Android 5.0+棒棒糖解决方案

DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

Field f[] = dpDate.getClass().getDeclaredFields();
            for (Field field : f) 
            {
                // Hides the DAY spinner
                if(field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) 
                {
                    field.setAccessible(true);
                    Object dayPicker = new Object();
                    dayPicker = field.get(dpDate);
                    ((View) dayPicker).setVisibility(View.GONE);
                }

                // Hides the MONTH spinner
                if(field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) 
                {
                    field.setAccessible(true);
                    Object monthPicker = new Object();
                    monthPicker = field.get(dpDate);
                    ((View) monthPicker).setVisibility(View.GONE);
                }

                // Hides the YEAR spinner
                if(field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) 
                {
                    field.setAccessible(true);
                    Object yearPicker = new Object();
                    yearPicker = field.get(dpDate);
                    ((View) myearPicker).setVisibility(View.GONE);
                }
            }
    DatePicker dpDate = (DatePicker) findViewById(R.id.dpDate);

    // Initialize Date Picker
    int year    = dpDate.getYear();
    int month   = dpDate.getMonth();
    int day     = dpDate.getDayOfMonth();
    dpDate.init(year, month, day, this);

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

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
                if (monthSpinnerId != 0) 
                {
                    View monthSpinner = dpDate.findViewById(monthSpinnerId);
                    if (monthSpinner != null) 
                    {
                        monthSpinner.setVisibility(View.GONE);
                    }
                }
            }

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            {
                int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
                if (yearSpinnerId != 0) 
                {
                    View yearSpinner = dpDate.findViewById(yearSpinnerId);
                    if (yearSpinner != null) 
                    {
                        yearSpinner.setVisibility(View.GONE);
                    }
                }
            }
我在这里找到了这个问题的上述解决方案:

我想确保它易于搜索,以便其他人可以从中受益,所以我创建了这个新帖子。(这个解决方案花了我几个小时来定位和理解,所以我希望能在这方面帮助别人)

我已经测试过了,效果非常好。事实上,如果你先把棒棒糖的解决方案放在下面,然后在代码中,把Kitkat的解决方案放在下面,那么它对两个版本都是兼容的,没有干扰。(确保使用try/catch;)

编辑7.22.2015:
我认为很明显,如果使用的是日期选择器,则需要对其进行初始化。我包含的代码表明,在运行其余代码(在这两种情况下)之前,需要初始化DatePicker,否则视图将抛出NullPointerException。这包括抛出空值的yearSpinner。此外,您应该至少有一个日期视图,不要隐藏所有3个视图,即不要同时隐藏日期、月份和年份。

仅针对懒人,这是一个完全集成的代码(任何SDK),用于我构建一个月选择器(90%等于@Brandon suggestion):


非常简单,但不直观

首先从
DialogPicker

new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog, this, year,month, day);
现在,是的,您可以隐藏任何微调器

dialog.getDatePicker().findViewById(getResources().getIdentifier("day","id","android")).setVisibility(View.GONE);

在5.0.2API21中对我来说可以正常工作,它对5和6+有不同的id。我已经处理了以下代码

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_year", "id", "android");
            if (yearSpinnerId != 0)
            {
                View yearSpinner = datePicker.findViewById(yearSpinnerId);
                if (yearSpinner != null)
                    yearSpinner.setVisibility(View.GONE);
            }
        }

        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            int yearSpinnerId = Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android");
            if (yearSpinnerId != 0)
            {
                View yearSpinner = datePicker.findViewById(yearSpinnerId);
                if (yearSpinner != null)
                    yearSpinner.setVisibility(View.GONE);
            }
        }

在这段代码中,“视图”总是空的。你必须更具体地说明你在说什么…我已经使用了上面的代码,我得到的“yearSpinner”是空的。问题应该是什么?我已经对上面的代码进行了编辑,以解释为什么你们都得到了NullPointerException。确保在试图隐藏视图之前初始化DatePicker,否则它将不知道该做什么。看看上面的编辑。我还要说,您需要在onCreate(对于活动)或onCreateView(对于片段)或onCreateDialog(对于DialogFragment)中声明DatePicker。在声明后,在一个单独的方法中初始化它。尝试了无数次这就是解决它的方法!