ViewPager и ViewPagerIndicator внутри RelativeLayout заставляют RelativeLayout расширяться на весь экран

Вот что вызывает у меня много проблем:

<RelativeLayout
    android:id="@+id/galleryLayout"
    android:layout_width="match_parent"
    android:layout_height="180dp"
    android:background="@color/white">

        <android.support.v4.view.ViewPager
            android:id="@+id/imageViewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true" />

        <com.viewpagerindicator.CirclePageIndicator
            android:id="@+id/circlePageIndicator"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:padding="@dimen/padding_middle"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"/>

</RelativeLayout>

Прямо сейчас этот код отчасти работает только потому, что я установил высоту RelativeLayout на 180dp, но я не хочу, чтобы это было так. Я хочу, чтобы все это имело высоту в соответствии с дочерним элементом ViewPager.

Есть ровно 2 проблемы, если я устанавливаю высоту RelativeLayout в WrapContent.

Проблема 1

ViewPager будет расширяться на весь экран. Он просто не учитывает атрибут высоты wrap_content. Но я частично решил это с помощью этого ответа. Я все равно был бы признателен, если бы было лучшее решение.

Проблема 2

Я хочу, чтобы CirclePageIndicator был внизу его родителя (RelativeLayout), поэтому я добавил атрибут layout_alignParentBottom="true", но теперь из-за этого RelativeLayout по какой-то причине будет расширяться на весь экран.

Итак, я пытаюсь получить RelativeLayout, который оборачивает ViewPager, который оборачивает его дочерний элемент. Ребенок загружается из Интернета, поэтому я не могу его предварительно установить. И внизу этого RelativeLayout я хочу иметь ViewPagerIndicator.




Ответы (1)


Что касается проблемы 1, вы решили ее правильно, ViewPager по умолчанию не будет оборачивать своих дочерних элементов.

Что касается второй проблемы, это нормальное RelativeLayout поведение. Если вы установите его height на wrap_content и добавите двух дочерних элементов, одного с layout_alignParentTop="true", а второго с layout_alignParentBottom="true", они растянут ваш layout по высоте.

Что вам следует сделать, так это спросить себя, действительно ли вам нужно RelativeLayout. Если вы предоставили весь свой макет, я не вижу необходимости в RelativeLayout (это дорого). Вертикальный LinearLayout вполне подойдет. Если вы решите, что вам действительно нужно RelativeLayout, попробуйте изменить правило Indicator's с layout_alignParentBottom="true" на android:layout_below="@+id/imageViewPager".

person Bartek Lipinski    schedule 05.10.2015
comment
Спасибо за ваш ответ. Проблема в том, что я хочу, чтобы индикатор находился внутри ViewPager, а не под ним. Поэтому я не вижу другого пути, кроме как использовать RelativeLayout. - person Guy; 05.10.2015
comment
вы всегда можете использовать FrameLayout (Indicator с layout_gravity="bottom") - person Bartek Lipinski; 05.10.2015
comment
Хм, это интересная идея. Я не думал об этом. Я не могу попробовать это прямо сейчас, но я сделаю это, как только вернусь домой. Я вернусь к вам и приму ваш ответ, если он сработает. Спасибо! - person Guy; 05.10.2015