Saya juga mengalami masalah ini, tetapi dalam kasus saya saya punya FragmentPagerAdapteryang memasok ViewPagerdengan halaman-halamannya. Masalah yang saya miliki adalah bahwa onMeasure()dari yang ViewPagerdipanggil sebelum salah satu Fragmentstelah dibuat (dan karena itu tidak dapat mengukur sendiri dengan benar).
Setelah sedikit trial and error, saya menemukan bahwa finishUpdate()metode FragmentPagerAdapter dipanggil setelah Fragmentsdiinisialisasi (dari instantiateItem()dalam FragmentPagerAdapter), dan juga setelah / selama pengguliran halaman. Saya membuat antarmuka kecil:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
yang saya sampaikan ke FragmentPagerAdapterdan menelepon saya :
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
yang pada gilirannya memungkinkan saya untuk memanggil implementasi setVariableHeight()saya 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;
}
}
Saya tidak yakin itu adalah pendekatan terbaik, akan suka komentar jika Anda pikir itu baik / buruk / jahat, tetapi tampaknya bekerja dengan sangat baik dalam implementasi saya :)
Semoga ini bisa membantu seseorang di luar sana!
Suntingan: Saya lupa menambahkan requestLayout()setelah menelepon super.measure()(jika tidak mengubah tampilan).
Saya juga lupa menambahkan padding orang tua ke ketinggian akhir.
Saya juga menjatuhkan menjaga lebar / tinggi asli MeasureSpecs demi menciptakan yang baru seperti yang diperlukan. Telah memperbarui kode yang sesuai.
Masalah lain yang saya miliki adalah bahwa ukurannya tidak benar dalam ScrollViewdan menemukan pelakunya mengukur anak dengan MeasureSpec.EXACTLYbukannya MeasureSpec.UNSPECIFIED. Diperbarui untuk mencerminkan ini.
Semua perubahan ini telah ditambahkan ke kode. Anda dapat memeriksa riwayat untuk melihat versi lama (salah) jika Anda mau.