天天看點

DatePicker日期選擇器隐藏Day選擇DatePicker日期選擇器隐藏Day,7.0Pad出錯

DatePicker日期選擇器隐藏Day,7.0Pad出錯

項目中用到DatePicker日期選擇器,但是由于其他原因隻想使用年和月選擇,于是就隐藏了日選擇器

((ViewGroup) ((ViewGroup) dp.getChildAt()).getChildAt()).getChildAt().setVisibility(View.GONE);
           

這種方法根據擷取子View的方式去隐藏Day選擇器,但是在三星的pad系統為7.0上就出現Null指針現象,由于沒有相關裝置,是以隻能猜測view的層次結構發生變化。是以隻能用其他方法去實作了如下

/**
     * 隐藏“天”
     * @param mDatePicker
     */
    private void hideDay(DatePicker mDatePicker) {
        try {
           /* 處理android5.0以上的特殊情況 */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //根據FindView方式去擷取DayView
                int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
                if (daySpinnerId != ) {
                    View daySpinner = mDatePicker.findViewById(daySpinnerId);
                    if (daySpinner != null) {
                        daySpinner.setVisibility(View.GONE);
                    }
                }
            } else {
            //根據反射的方法去擷取DayView字段
                Field[] datePickerfFields = mDatePicker.getClass().getDeclaredFields();
                for (Field datePickerField : datePickerfFields) {
                    if ("mDaySpinner".equals(datePickerField.getName()) || ("mDayPicker").equals(datePickerField.getName())) {
                        datePickerField.setAccessible(true);
                        Object dayPicker = new Object();
                        try {
                            dayPicker = datePickerField.get(mDatePicker);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        }
                        ((View) dayPicker).setVisibility(View.GONE);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
           

繼續閱讀