Я знаю, что вопрос немного устарел, но мой ответ мог бы помочь кому-то еще, поскольку ваш вопрос и ответ Колина помогли мне.
У меня точно такая же проблема, как и у вас. И есть два решения для этого.
Во-первых, вам нужно убедиться, что у вашего ViewPager для * layout_width * и * layout_height * установлено значение * match_parent *, и что иерархия представлений организована таким образом, что Android не придет к выводу, что ему нужно изменить макет любого родительских макетов ViewPager.
Например, предположим, что у вас есть RelativeLayout с двумя представлениями фиксированных размеров один под другим и ViewPager под вторым представлением. В этом случае любое изменение ViewPager будет распространяться на родительский макет. Однако, если вы поместите эти два представления фиксированного размера и ViewPager в LinearLayout, этого не произойдет, запрос макета не будет распространен за пределы ViewPager. Более того, запрос макета на одной странице ViewPager также не будет распространяться на другие страницы.
Второе решение (на самом деле это скорее вторая часть решения) - это ваш FrameLayout, но измененный так:
public class LayoutStopperFrameLayout extends FrameLayout {
private boolean doLayout;
public LayoutStopperFrameLayout(Context context) {
super(context);
doLayout = true;
}
public LayoutStopperFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
doLayout = true;
}
public LayoutStopperFrameLayout(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
doLayout = true;
}
public void setPropagateRequestLayout(boolean doLayout) {
this.doLayout = doLayout;
}
@Override
public void requestLayout() {
if (doLayout) {
// DO THE LAYOUT REQUEST UP TO THE TOP
super.requestLayout();
}
}
}
В моем приложении я вызываю setPropagateRequestLayout () в методах Fragment onStart и onStop, чтобы включить или выключить запросы макета соответственно.