Android 所有片段的Viewpager动态高度(如谷歌日历)
也许我不能在标题中解释这个问题 我正在开发一个日历应用程序,该日历的分页由ViewPager完成。 首先,我无法排列ViewPager的高度,因为它填充了所有的换页内容,所以我编写了一个自定义ViewPager,但出现了一个新问题 如下图所示,日历中的某些月份有6行,但gridview中的某些月份有7行。它根据一天的开始、月份的总天数等进行更改 如果行号计数为7,我想放大它的大小;如果行号计数为6,我想缩小它的大小。谷歌日历可以做到这一点 下面是我的CustomViewPagerAndroid 所有片段的Viewpager动态高度(如谷歌日历),android,android-fragments,calendar,Android,Android Fragments,Calendar,也许我不能在标题中解释这个问题 我正在开发一个日历应用程序,该日历的分页由ViewPager完成。 首先,我无法排列ViewPager的高度,因为它填充了所有的换页内容,所以我编写了一个自定义ViewPager,但出现了一个新问题 如下图所示,日历中的某些月份有6行,但gridview中的某些月份有7行。它根据一天的开始、月份的总天数等进行更改 如果行号计数为7,我想放大它的大小;如果行号计数为6,我想缩小它的大小。谷歌日历可以做到这一点 下面是我的CustomViewPager public
public class CustomCalendarViewPager extends ViewPager {
public CustomCalendarViewPager( Context context ) {
super( context );
}
public CustomCalendarViewPager( Context context, AttributeSet attrs ) {
super( context, attrs );
}
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) {
super.onMeasure( widthMeasureSpec, heightMeasureSpec );
int height = 0;
for ( int i = 0; i < getChildCount(); i++ ) {
View child = getChildAt( i );
child.measure( widthMeasureSpec, MeasureSpec.makeMeasureSpec( 0, MeasureSpec.UNSPECIFIED ) );
int h = child.getMeasuredHeight();
int leap_space = Math.round( ( h / 4 ) );
if ( h > height ) height = ( h * 7 ) + leap_space;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec( height, MeasureSpec.EXACTLY );
super.onMeasure( widthMeasureSpec, heightMeasureSpec );
}
}
在ViewPager上设置,并在onPageSelected覆盖中,调用requestLayout和invalidate以强制寻呼机重新测量其高度
在onMeasure中,使用当前选择的项目设置高度。我调用了OnPageSelected中的requestLayout和invalidate函数,但我不知道我将在onMeasure中做什么。我编辑了我的问题。基本上不是循环所有项目来获取高度,而是获取索引处项目的高度getCurrentItemgetCurrentItem函数只返回当前位置。我尝试了测量和设置测量尺寸的方法。我读了这个=>和这个=>请你告诉我在测量中应该做什么。我已经挣扎了4个小时:我要说的是,不是一个for循环,而是对所有孩子进行测量。只需使用getChildAtgetCurrentItem并测量它。这就是我完全理解你的意思,但它不起作用。它抛出NullPointerException。即使它不起作用,谢谢你的帮助。
calendar_pager.setOnPageChangeListener( new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels ) {
}
@Override
public void onPageSelected( int position ) {
System.out.println( "onPageSelected " + position );
calendar_pager.requestLayout();
calendar_pager.invalidate();
}
@Override
public void onPageScrollStateChanged( int state ) {
}
} );