How to decide the Caldroid height in ScrollView(How to decide the height of GridView embed in ScrollView)
How to decide the Caldroid height in ScrollView (How to decide the height of GridView embed in ScrollView)
CaldroidFragment 嵌入到ScrollView 时大小混乱。原因是 Caldroid 使用 GridView 来渲染日历,作为一个已知问题,GridView 无法在 ScrollView 中正确测量它的高度,到目前为止还没有更好的解决方案。我尝试了 here 中提到的一些解决方法,但到目前为止还没有找到任何可行的方法。
终于找到了可行的解决方案。 gennis给出的解决方案here是正确的。我所做的唯一更改是将代码 calendarContainer.getViewTreeObserver().addOnGlobalLayoutListener(CalendarViewTreeObserver)
放入 CaldroidFragment.
的回调函数 onCaldroidViewCreated
中
grennis (here) 的解决方案是正确的,也许只是为了更好地解释它:
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,此解决方法可能仅适用于 API 16 +,并且在示例中我在 Fragment
中工作
CaldroidFragment 嵌入到ScrollView 时大小混乱。原因是 Caldroid 使用 GridView 来渲染日历,作为一个已知问题,GridView 无法在 ScrollView 中正确测量它的高度,到目前为止还没有更好的解决方案。我尝试了 here 中提到的一些解决方法,但到目前为止还没有找到任何可行的方法。
终于找到了可行的解决方案。 gennis给出的解决方案here是正确的。我所做的唯一更改是将代码 calendarContainer.getViewTreeObserver().addOnGlobalLayoutListener(CalendarViewTreeObserver)
放入 CaldroidFragment.
onCaldroidViewCreated
中
grennis (here) 的解决方案是正确的,也许只是为了更好地解释它:
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,此解决方法可能仅适用于 API 16 +,并且在示例中我在 Fragment
中工作