ฉันพบปัญหานี้ด้วยเช่นกัน แต่ในกรณีของฉันฉันได้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()
(มิฉะนั้นจะไม่วาดมุมมองใหม่)
ฉันลืมเพิ่มช่องว่างภายในของผู้ปกครองลงในความสูงสุดท้าย
ฉันยังลดขนาดการวัดความกว้าง / ความสูงดั้งเดิมไว้ด้วยเพื่อสร้างใหม่ตามที่ต้องการ ได้ปรับปรุงรหัสตาม
ผมมีปัญหาอีกประการหนึ่งคือว่ามันจะไม่ได้ขนาดตัวเองอย่างถูกต้องในScrollView
และพบว่าผู้กระทำผิดได้รับการวัดเด็กที่มีแทนMeasureSpec.EXACTLY
MeasureSpec.UNSPECIFIED
อัปเดตเพื่อสะท้อนถึงสิ่งนี้
การเปลี่ยนแปลงเหล่านี้ได้ถูกเพิ่มลงในรหัสแล้ว คุณสามารถตรวจสอบประวัติเพื่อดูเวอร์ชันเก่า (ไม่ถูกต้อง) หากคุณต้องการ