2013-02-20 7 views

답변

4

분명히, 그것은 CalendarView에 대한 코드의 버그입니다. 다음은 버그에 대한 참조입니다. 그것은 진정한 대답은 아니지만 더 많은 설명이 필요합니다.

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

추정되게, 그것은 4.2에서 수정 된 것.

2

여전히 관심이있는 사용자는 Phil의 게시물과 XSJoJo의 보고서에 제공된 정보를 기반으로 한 내 솔루션입니다. 여기서 언급했듯이 mDateTextSizeCalendarViewLegacyDelegatemMonthNumDrawPaint에 할당되지 않았기 때문에 문제가 발생했습니다. 자바 리플렉션을 사용하고 있습니다.

/** 
    * 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); 
     } 
    } 
관련 문제