【问题标题】:small numbers in CalendarView androidCalendarView android中的小数字
【发布时间】:2019-08-31 07:21:07
【问题描述】:

我的应用需要 CalendarView。但是天数非常少。如何让它们变大?

【问题讨论】:

    标签: android calendar


    【解决方案1】:

    如果有人仍然感兴趣,这是我基于 Phil 帖子中提供的信息和 XSJoJo 报告的解决方案。如那里所述,存在问题是因为mDateTextSize 未分配给CalendarViewLegacyDelegate 中的mMonthNumDrawPaint。我正在使用 Java 反射。

        /**
         * I'm doing this in my fragment's onCreateView() callback
         */
    
        CalendarView calendarView = (CalendarView) contentView.findViewById(R.id.calendar_view);
    
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) { // this bug exists only in Android 4.1
            try {
                Object object = calendarView;
                Field[] fields = object.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if (field.getName().equals("mDelegate")) { // the CalendarViewLegacyDelegate instance is stored in this variable
                        field.setAccessible(true);
                        object = field.get(object);
    
                        break;
                    }
                }
    
                Field field = object.getClass().getDeclaredField("mDateTextSize"); // text size integer value
                field.setAccessible(true);
                final int mDateTextSize = (Integer) field.get(object);
    
                field = object.getClass().getDeclaredField("mListView"); // main ListView
                field.setAccessible(true);
                Object innerObject = field.get(object);
    
                Method method = innerObject.getClass().getMethod(
                        "setOnHierarchyChangeListener", ViewGroup.OnHierarchyChangeListener.class); // we need to set the OnHierarchyChangeListener
                method.setAccessible(true);
                method.invoke(innerObject, (Object) new ViewGroup.OnHierarchyChangeListener() {
                    @Override
                    public void onChildViewAdded(View parent, View child) { // apply text size every time when a new child view is added
                        try {
                            Object object = child;
                            Field[] fields = object.getClass().getDeclaredFields();
                            for (Field field : fields) {
                                if (field.getName().equals("mMonthNumDrawPaint")) { // the paint is stored inside the view
                                    field.setAccessible(true);
                                    object = field.get(object);
                                    Method method = object.getClass().
                                            getDeclaredMethod("setTextSize", float.class); // finally set text size
                                    method.setAccessible(true);
                                    method.invoke(object, (Object) mDateTextSize);
    
                                    break;
                                }
                            }
                        } catch (Exception e) {
                            Log.e(APP_TAG, e.getMessage(), e);
                        }
                    }
    
                    @Override
                    public void onChildViewRemoved(View parent, View child) {}
                });
            } catch (Exception e) {
                Log.e(APP_TAG, e.getMessage(), e);
            }
        }
    

    【讨论】:

      【解决方案2】:

      显然,这是 CalendarView 代码中的错误。这是对该错误的参考。我猜这不是一个真正的答案,但更多的是一种解释。

      https://code.google.com/p/android/issues/detail?id=34932

      据称,它已在 4.2 中修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多