Android ViewPager维度

时间:2011-12-16 09:43:26

标签: android android-layout android-viewpager

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 个答案:

答案 0 :(得分:6)

ViewPager不支持wrap_content,因为它(通常)从不会同时加载所有子项,因此无法获得适当的大小(选项是每个都有一个更改大小的寻呼机你换页的时间。)

但是,您可以设置精确尺寸(例如150dp)和match_parent 您还可以通过更改height中的LayoutParams - 属性,从代码中动态修改维度。

答案 1 :(得分:4)

指定布局权重以查看寻呼机为1&amp; 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"/>

答案 2 :(得分:0)

我用几个黑客解决了这个问题。以下是它涉及的内容:

首先,我需要一个忽略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));