ViewPager в android выполняет полный экран?

В моем xml файле у меня есть линейная компоновка, в которой есть ViewPager для показа изображений и другой линейный макет, содержащий предыдущие и следующие кнопки для выбора изображений. Мой xml выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal" >

            <Button
                android:id="@+id/goto_first"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="first" >
            </Button>

            <Button
                android:id="@+id/goto_last"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="last" >
            </Button>
        </LinearLayout>

    </LinearLayout>

Моя проблема заключается в том, что ViewPager работает в полноэкранном режиме, а Linearlayout с предыдущими следующими кнопками не отображается, потому что для этого LinearLayout нет свободного места.

Я использую Fragments для заполнения ViewPager с представлениями. XML файл для представления фрагмента, который входит в ViewPager, это:

<ImageView
    android:id="@+id/ItemImage"
    android:layout_width="320dp"
    android:layout_height="180dp" />

<TextView
    android:id="@+id/ItemText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="left|bottom"
    android:layout_marginBottom="5dp"
    android:textColor="#ffffffff"
    android:textStyle="bold" />
</FrameLayout>

Результат, который я получаю после рендеринга, выглядит следующим образом:
  1.изображение (покрытие 45% экрана)  
2.Bank пространство (покрытие 45% экрана)  
3.Textview(покрытие остальных 10% высоты экрана)

Выход, который я хочу:  
1.изображение (покрытие 45% экрана)  
2.Textview(покрытие 10% экрана)  
3.LinearLayout для кнопок (покрытие остальных 45% высоты экрана)

Ответ 1

Используйте RelativeLayout. Добавьте свои кнопки к нижней части с помощью alignParentBottom="true". Затем добавьте ViewPager с помощью layout_above="@id/buttons"

Ответ 2

Просто откройте их для просмотра:

 android:layout_height="0dp"
 android:layout_weight="1"

Ответ 3

Проблема с viewpagers заключается в том, что они не знают размер, поскольку каждый фрагмент может быть другого размера. Вы должны вручную установить viewpager, а не wrap_content. Я рекомендую установить вес для всех элементов внешней линейной компоновки.

Ответ 4

Просто используйте RelativeLayout и используйте такие атрибуты, как `

android: layout_below

пока вы не достигнете желаемой позиции. Относительная компоновка - ваш друг в этих случаях.

Ответ 5

Просто сделайте следующее, чтобы освободить место для других видов, ниже или выше:

< android.support.v4.view.ViewPager **android:layout_width**="match_parent" **android:layout_height**="match_parent" **android:layout_weight**="1"/>

Этот ответ был взят из комментария, сделанного Хаве из ответов, приведенных по ссылке ниже.

Ссылка: "измерение Android ViewPager"

Ответ 6

public class WrapViewPager extends ViewPager {

    public WrapViewPager(Context context) {
        super(context);
    }

    public WrapViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if (h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

Ответ 7

В моем случае этот код работает:

<androidx.viewpager.widget.ViewPager
    android:id="@+id/myviewpager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" />