ViewPager不支持使用layout_height = wrap_content

12

我正在构建一个具有以下布局的Android应用程序。application layout

已知layout_height="wrap_content"对ViewPager不起作用。

我的问题是如何动态地更改它。ViewPager的内容是从两个xml布局vp_statistics.xml和vp_campaigns.xml中填充的。

这是ViewPager的XML代码:

<LinearLayout
            android:id="@+id/topcontent_wrapper"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="vertical" >
</LinearLayout>

<LinearLayout
            android:id="@+id/viewpager_wrapper"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="vertical" >

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

这是我的PagerAdapter的代码:

class MyPagerAdapter extends PagerAdapter{

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 2;
}

public Object instantiateItem(View collection, int pos){
    LayoutInflater inflater =     (LayoutInflater)collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch(pos){
    case 0:
        resId = R.layout.vp_statistics;
        break;
    case 1:
        resId = R.layout.vp_campaigns;
        break;
    }

    View view = inflater.inflate(resId, null);


    ((ViewPager)collection).addView(view, 0);

    return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    // TODO Auto-generated method stub
    ((ViewPager)container).removeView((View)object);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    // TODO Auto-generated method stub
    return arg0 == ((View)arg1);
}

@Override
public Parcelable saveState() {
    // TODO Auto-generated method stub
    return null;
}

}

并且在我的Activity类的onCreate()方法内部:

MyPagerAdapter adapter = new MyPagerAdapter();
ViewPager viewPager = (ViewPager)findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);

有没有一种方法可以在每次调用 instantiateItem() 对象时获取 vp_statistics.xmlvp_campaigns.xml 布局的高度,并动态地将其分配给 ViewPager (@id/viewpager)


你解决了问题吗?我有类似的问题。 - Matroska
你找到这个问题的解决方案了吗? - koti
请给这个问题点个赞 https://code.google.com/p/android/issues/detail?id=54604 - Christ
5个回答

6
  1. 给父级LinearLayout添加weightSum=2属性,并将orientation=vertical
  2. 将顶部子级LinearLayoutlayout_weight=1设置。同时,设置layout_height=0dip
  3. 将ViewPager包装到另一个LinearLayout中,其中layout_weight=1layout_height=0dip

@bagusflyer如果您分享您的代码,我们可能就能看出问题所在。 - josephus

2

我在这里回答了一个类似的问题

解决方案是扩展ViewPager,重写onMeasure()方法,使得高度可以正常地使用wrap_content


0

使用0dp代替wrap_content,并且可以动态更改

pager = new ViewPager(this);
        pager.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

9
您的代码无法正常工作,实际上会导致应用程序崩溃。正确的代码应该是:`pager.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));`但即使更改了代码,ViewPager的高度仍然没有改变。 - Andrei Stalbe

-1
为了给每个线性布局分配不同的屏幕空间,请尝试使用layout_weight参数。您可以在代码中重新分配它,以实现这种“动态”权重变化。在这里点击链接可以找到很多可供参考的示例,教你如何在代码中实现权重布局...

我在我的应用程序中尝试的不是为顶部布局和底部ViewPager分配权重,以便为每个屏幕分配一半,而是在每次ViewPager页面更改时为ViewPager的高度分配不同的值,因为表示ViewPager页面的布局高度不同。例如,如果第一页的高度为200dp,并且我分配了viewpager layout_height="200dp",当切换到第二页(高度为400dp)时,底部的200dp将被隐藏! - Andrei Stalbe
嘿,Andrei,听起来你需要在视图绘制完成后测量视图,并更新你的视图页宽度和高度。最近我也在将Google Charts嵌入WebViews时遇到了类似的任务。请查看有关此主题的这个答案,它会帮助你解决问题。 - BrantApps

-2
使用RelativeLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout 
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

    </LinearLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/layout" >

    </android.support.v4.view.ViewPager>

</RelativeLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接