1

CaldroidFragment 的大小在嵌入到 ScrollView 时会变得混乱。原因是 Caldroid 使用 GridView 来呈现日历,并且作为一个已知问题 GridView 无法在 ScrollView 中正确测量其高度,到目前为止还没有更好的解决方案。我尝试了这里提到的一些解决方法,但到目前为止还没有发现任何可行的方法。

4

2 回答 2

1

grennis (这里) 的解决方案是正确的,也许只是为了更好地解释它:

1.- 在 xml 模板上添加 FrameLayout:

<FrameLayout android:id="@+id/calendar_container"
        android:layout_width="match_parent"
        android:layout_height="999dp" />

2.- 在您的 Java Activity 或 Fragment 上添加变量和侦听器

 private ViewTreeObserver.OnGlobalLayoutListener CalendarViewTreeObserver = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            calendarContainer.getViewTreeObserver().removeOnGlobalLayoutListener(CalendarViewTreeObserver);
            ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) calendarContainer.getLayoutParams();
            lp.height = ((ViewGroup)calendarContainer).getChildAt(0).getHeight();
            calendarContainer.setLayoutParams(lp);
            calendarContainer.requestLayout();
        }
    };
private FrameLayout calendarContainer;

3.- 将适当的资源分配给变量日历容器(可以在 onCreate 或类似方法中完成):

calendarContainer = (FrameLayout) getActivity().findViewById(R.id.calendar_container);
        calendarContainer.getViewTreeObserver().addOnGlobalLayoutListener(CalendarViewTreeObserver);
        setCustomResourceForDates();

4.- 使用交易设置 Caldroid 片段

FragmentTransaction t = getActivity().getSupportFragmentManager().beginTransaction();
        t.replace(R.id.calendar_container, caldroidFragment);
        t.commit();

也许其他一些考虑因素是,由于 removeOnGlobalLayoutListener 和在示例中我在 Fragment 内工作,此解决方法可能仅适用于 API 16 +

于 2015-09-30T18:08:54.820 回答
0

终于找到了可行的解决方案。gennis 在这里给出的解决方案是正确的。我所做的唯一更改是将代码放入CaldroidFragmentcalendarContainer.getViewTreeObserver().addOnGlobalLayoutListener(CalendarViewTreeObserver)的回调函数中。onCaldroidViewCreated

于 2015-09-28T08:44:04.397 回答