Android ViewPager измерение - PullRequest
       0

Android ViewPager измерение

7 голосов
/ 16 декабря 2011

Должен ли ViewPager быть единственным объектом, присутствующим внутри макета активности?Я пытаюсь реализовать что-то вроде этого:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reader_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

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

<Gallery
    android:id="@+id/miniatures_gallery"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" /></LinearLayout>

Где я должен иметь большую прокрутку пейджера вверху (и она у меня есть) и меньшую прокрутку галереи под ней.Это показывает мне только пейджер, а не галерею.Любое предложение?

Ответы [ 3 ]

6 голосов
/ 16 декабря 2011

ViewPager не поддерживает wrap_content, поскольку у него (как правило) никогда не загружаются все дочерние элементы одновременно, и поэтому он не может получить подходящий размер (можно использовать пейджер, который меняет размер каждый раз, когда выперешли на другую страницу).

Тем не менее, вы можете установить точный размер (например, 150dp), и match_parent также работает.
Вы также можете динамически изменять размеры из своего кода, изменяя height -атрибут в его LayoutParams.

4 голосов
/ 02 июля 2013

Назначьте вес макета для просмотра пейджера как 1 & height = 0dp вместо wrap_content

<android.support.v4.view.ViewPager
    android:id="@+id/page_viewer"
    android:layout_width="match_parent"
    android:layout_height="0dp" 
    android:layout_weight="1"/>
0 голосов
/ 11 декабря 2012

Я решил проблему парой хаков. Вот что это включает:

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

public class TallLinearLayout extends LinearLayout {

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

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

    public TallLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, MeasureSpec.UNSPECIFIED);
    }
}

Затем я написал логику для изменения размера ViewPager:

private class ViewPagerContentWrapper implements OnGlobalLayoutListener {
    private ViewPager mViewPager;

    public ViewPagerContentWrapper(ViewPager viewPager) {
        mViewPager = viewPager;
    }

    @Override
    public void onGlobalLayout() {
        int position = mViewPager.getCurrentItem(); 
        check(position);
        check(position + 1);
    }

    private void check(int position) {
        ViewGroup vg = (ViewGroup) mViewPager.getChildAt(position); 
        View v = vg == null ? null : vg.getChildAt(0);

        if (v != null) {
            int height = v.getHeight();
            if (height > mViewPager.getHeight()) {
                resize(height);
            }
        }
    }

    private void resize(int height) {
        mViewPager.setLayoutParams(
                new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT,
                        height
                )
        );
    }
}

Который я зарегистрировал как слушатель глобального макета:

viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewPagerContentWrapper(viewPager));
...