나는 또한이 문제에 부딪 쳤지 만 내 경우에는 페이지를 FragmentPagerAdapter
제공 하는 것이 있었다 ViewPager
. 내가 가진 문제는 것이 었 onMeasure()
의 ViewPager
의 어떤 전에 호출 된 Fragments
생성 (따라서 수없는 크기 자체가 제대로)되었다.
시행 착오를 조금 후에, 나는 것을 발견 finishUpdate()
이 후 FragmentPagerAdapter의 메소드가 호출 Fragments
(에서 초기화 된 instantiateItem()
에서 FragmentPagerAdapter
), 또한 후 / 페이지 스크롤시. 작은 인터페이스를 만들었습니다.
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
내가 전달 FragmentPagerAdapter
하고 전화 :
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
이것은 다시 전화하라고 할 수 있습니다 setVariableHeight()
내에서 CustomViewPager
구현 :
public void setVariableHeight()
{
// super.measure() calls finishUpdate() in adapter, so need this to stop infinite loop
if (!this.isSettingHeight)
{
this.isSettingHeight = true;
int maxChildHeight = 0;
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
for (int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED));
maxChildHeight = child.getMeasuredHeight() > maxChildHeight ? child.getMeasuredHeight() : maxChildHeight;
}
int height = maxChildHeight + getPaddingTop() + getPaddingBottom();
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.measure(widthMeasureSpec, heightMeasureSpec);
requestLayout();
this.isSettingHeight = false;
}
}
나는 그것이 최선의 접근법인지 확신하지 못하고, 그것이 좋거나 나쁘거나 악하다고 생각하면 의견을 좋아할 것이지만, 그것은 내 구현에서 꽤 잘 작동하는 것 같습니다 :)
이것이 누군가를 도울 수 있기를 바랍니다!
편집 :requestLayout()
호출 한 후 추가하는 것을 잊었습니다 super.measure()
(그렇지 않으면 뷰를 다시 그리지 않습니다).
또한 부모의 패딩을 최종 높이에 추가하는 것을 잊었습니다.
또한 필요에 따라 새 너비 / 높이 MeasureSpec을 유지하여 새 너비 / 높이 측정 사양을 유지하는 것을 중단했습니다. 이에 따라 코드를 업데이트했습니다.
내가 가진 또 다른 문제는 그것이 제대로 크기를 맞추지 못하고 ScrollView
범인이 MeasureSpec.EXACTLY
대신 아이를 측정한다는 것을 알았습니다 MeasureSpec.UNSPECIFIED
. 이를 반영하여 업데이트되었습니다.
이러한 변경 사항이 모두 코드에 추가되었습니다. 원하는 경우 기록을 확인하여 이전 (잘못된) 버전을 볼 수 있습니다.