Ich nutze diese Ressourcen, um Versuche und Irrtümer durchzuführen. Jetzt hat mein benutzerdefinierter ViewPager seinen Inhalt erfolgreich gemessen, aber nur der erste wurde angezeigt. Zu Ihrer Information, mein ViewPager enthält einige komplexe Ansichten, wie ExpendableListView – deshalb funktioniert keiner der Codes in diesen Ressourcen perfekt, ich muss den Code selbst ändern.
Ich habe 4 Fragmente (Inhalt), also verwende ich pager.setOffscreenPageLimit(3);
Dies ist mein benutzerdefinierter ViewPager :
Code: Select all
public class CustomViewPager extends ViewPager{
public CustomViewPager (Context context) {
super(context);
}
public CustomViewPager (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
final View tab = getChildAt(0);
int width = getMeasuredWidth();
int tabHeight = tab.getMeasuredHeight();
if (wrapHeight) {
// Keep the current measured width.
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
}
int fragmentHeight = measureFragment(((Fragment) getAdapter().instantiateItem(this, getCurrentItem())).getView());
heightMeasureSpec = MeasureSpec.makeMeasureSpec(tabHeight + fragmentHeight + (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()), MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public int measureFragment(View view) {
if (view == null)
return 0;
view.measure(0, 0);
return view.getMeasuredHeight();
}
}
Code: Select all
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
android.view.ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
Code: Select all
Wenn die Höhe des ersten Fragments 100 Pixel beträgt, dann Alle anderen Fragmente bleiben bei 100 Pixel.
Wenn also die Höhe des zweiten Fragments 130 Pixel beträgt, wird es auf 100 Pixel gekürzt.
Als ich es versucht habe zum Debuggen, das onMeasure wird auf meinem CustomViewPager immer viermal aufgerufen, wenn die Aktivität erstellt wird, aber alle lesen nur das erste Fragment. Das onMeasure wird danach nie wieder aufgerufen, selbst wenn ich von einem Fragment zum anderen wechsle (nach links/rechts schiebe).
Bitte helfen Sie mir, ich habe viele Stunden damit verbracht, dieses Ding zum Laufen zu bringen.
Fragen Sie mich einfach, wenn Sie weitere Informationen benötigen. Vielen Dank für Ihre Zeit.