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