내 캘린더보기가 필요합니다. 그러나 그 날의 숫자는 매우 적습니다. 그들을 더 크게 만드는 방법?CalendarView의 작은 숫자 및 Android
CalendarView http://oi47.tinypic.com/23vnakl.jpg
내 캘린더보기가 필요합니다. 그러나 그 날의 숫자는 매우 적습니다. 그들을 더 크게 만드는 방법?CalendarView의 작은 숫자 및 Android
CalendarView http://oi47.tinypic.com/23vnakl.jpg
분명히, 그것은 CalendarView에 대한 코드의 버그입니다. 다음은 버그에 대한 참조입니다. 그것은 진정한 대답은 아니지만 더 많은 설명이 필요합니다.
https://code.google.com/p/android/issues/detail?id=34932
추정되게, 그것은 4.2에서 수정 된 것.
여전히 관심이있는 사용자는 Phil의 게시물과 XSJoJo의 보고서에 제공된 정보를 기반으로 한 내 솔루션입니다. 여기서 언급했듯이 mDateTextSize
이 CalendarViewLegacyDelegate
의 mMonthNumDrawPaint
에 할당되지 않았기 때문에 문제가 발생했습니다. 자바 리플렉션을 사용하고 있습니다.
/**
* 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);
}
}