Ben de bu sorunla karşılaştım, ama benim durumumda onun sayfaları ile FragmentPagerAdaptertedarik bir vardı ViewPager. Ben sorun olmasıydı onMeasure()arasında ViewPagerherhangi önce çağrıldı Fragmentsoluşturulan (ve dolayısıyla yapamadı boyut kendisi doğru) olmuştu.
Biraz deneme yanılma finishUpdate()işleminden sonra, FragmentPagerAdapter yönteminin Fragmentsbaşlatıldıktan sonra ( instantiateItem()içinde FragmentPagerAdapter) ve ayrıca sayfa kaydırma sırasında / sırasında çağrıldığını gördüm . Küçük bir arayüz yaptım:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
hangi benim içine geçmek FragmentPagerAdapterve aramak:
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
bu da setVariableHeight()benim CustomViewPageruygulamamı aramamı sağlıyor :
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;
}
}
En iyi yaklaşım olduğundan emin değilim, iyi / kötü / kötü olduğunu düşünüyorsanız yorumları seveceksiniz, ancak benim uygulamada oldukça iyi çalışıyor gibi görünüyor :)
Umarım bu birisine yardım eder!
DÜZENLEME: Bir requestLayout()aramadan sonra eklemeyi unuttum super.measure()(aksi takdirde görünümü yeniden çizmez).
Ayrıca ebeveynin dolgusunu son yüksekliğe eklemeyi unuttum.
Ayrıca orijinal genişlik / yükseklik MeasureSpecs gerektiği gibi yeni bir tane oluşturmak lehine tutarak düştü. Kodu buna göre güncelleyin.
Sahip olduğum başka bir sorun, kendini doğru bir şekilde boyutlandırmaması ScrollViewve suçlu MeasureSpec.EXACTLYyerine çocuk ölçmek olduğunu bulundu MeasureSpec.UNSPECIFIED. Bunu yansıtacak şekilde güncellendi.
Bu değişikliklerin tümü koda eklenmiştir. İsterseniz eski (yanlış) sürümleri görmek için geçmişi kontrol edebilirsiniz.