Я использую эти ресурсы для проб и ошибок. Теперь мой пользовательский ViewPager успешно измеряет свое содержимое, но отображается только первое. К вашему сведению, мой ViewPager содержит некоторые сложные представления, такие как ExpendableListView, поэтому ни один код в этих ресурсах не работает идеально, мне нужно изменить код самостоятельно.
У меня есть 4 фрагмента (содержимого), поэтому я использую pager.setOffscreenPageLimit(3);
Это мой собственный ViewPager
Это мой собственный ViewPager
код> :
Код: Выделить всё
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();
}
}
Код: Выделить всё
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
android.view.ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
Код: Выделить всё
Если высота первого фрагмента равна 100 пикселей, то все остальные фрагменты останутся на уровне 100 пикселей.
Поэтому, если высота второго фрагмента составит 130 пикселей, он будет обрезан до 100 пикселей.
Когда я попробовал для отладки, onMeasure на моем CustomViewPager всегда вызывается 4 раза при создании Activity, но все они читают только первый фрагмент. После этого onMeasure никогда не будет вызываться снова, даже когда я переключаюсь (сдвигаю влево/вправо) от одного фрагмента к другому.
Пожалуйста, помогите мне, я потратил много часов, чтобы заставить эту штуку работать.
Просто спросите меня, нужна ли вам дополнительная информация, спасибо за ваше время.
Подробнее здесь: https://stackoverflow.com/questions/235 ... ents-heigh