Ich bin auch auf dieses Problem gestoßen, aber in meinem Fall hatte ich ein Problem, FragmentPagerAdapter
das die ViewPager
Seiten lieferte . Das Problem, das ich hatte, war das onMeasure()
des ViewPager
wurde vor einem der angerufenFragments
erstellt wurde (und sich daher nicht richtig dimensionieren konnte).
Nach einigem Ausprobieren stellte ich fest, dass die finishUpdate()
Methode des FragmentPagerAdapter aufgerufen wird, nachdem die Fragments
(von instantiateItem()
in FragmentPagerAdapter
) und auch nach / während des Bildlaufs initialisiert wurden . Ich habe eine kleine Schnittstelle gemacht:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
was ich in meine übergebe FragmentPagerAdapter
und rufe:
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
was mir wiederum erlaubt, setVariableHeight()
auf meine CustomViewPager
Implementierung zurückzugreifen:
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;
}
}
Ich bin mir nicht sicher, ob es der beste Ansatz ist. Ich würde mich über Kommentare freuen, wenn Sie denken, dass es gut / schlecht / böse ist, aber es scheint in meiner Implementierung ziemlich gut zu funktionieren :)
Hoffe das hilft jemandem da draußen!
BEARBEITEN: Ich habe vergessen, requestLayout()
nach dem Aufruf ein hinzuzufügen super.measure()
(andernfalls wird die Ansicht nicht neu gezeichnet).
Ich habe auch vergessen, die Polsterung der Eltern zur endgültigen Höhe hinzuzufügen.
Ich habe auch die ursprüngliche Breite / Höhe MeasureSpecs beibehalten, um bei Bedarf eine neue zu erstellen. Habe den Code entsprechend aktualisiert.
Ein weiteres Problem, das ich hatte, war, dass es sich in einem nicht richtig dimensionierte ScrollView
und feststellte, dass der Täter das Kind mit MeasureSpec.EXACTLY
statt maß MeasureSpec.UNSPECIFIED
. Aktualisiert, um dies widerzuspiegeln.
Diese Änderungen wurden alle dem Code hinzugefügt. Sie können den Verlauf überprüfen, um die alten (falschen) Versionen anzuzeigen, wenn Sie möchten.