Ответ 1
Используйте RelativeLayout. Добавьте свои кнопки к нижней части с помощью alignParentBottom="true"
. Затем добавьте ViewPager с помощью layout_above="@id/buttons"
В моем 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% высоты экрана)
Используйте RelativeLayout. Добавьте свои кнопки к нижней части с помощью alignParentBottom="true"
. Затем добавьте ViewPager с помощью layout_above="@id/buttons"
Просто откройте их для просмотра:
android:layout_height="0dp"
android:layout_weight="1"
Проблема с viewpagers заключается в том, что они не знают размер, поскольку каждый фрагмент может быть другого размера. Вы должны вручную установить viewpager, а не wrap_content. Я рекомендую установить вес для всех элементов внешней линейной компоновки.
Просто используйте RelativeLayout и используйте такие атрибуты, как `
android: layout_below
пока вы не достигнете желаемой позиции. Относительная компоновка - ваш друг в этих случаях.
Просто сделайте следующее, чтобы освободить место для других видов, ниже или выше:
< android.support.v4.view.ViewPager **android:layout_width**="match_parent" **android:layout_height**="match_parent" **android:layout_weight**="1"/>
Этот ответ был взят из комментария, сделанного Хаве из ответов, приведенных по ссылке ниже.
Ссылка: "измерение Android ViewPager"
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);
}
}
В моем случае этот код работает:
<androidx.viewpager.widget.ViewPager
android:id="@+id/myviewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />