2015-05-26 112 views
1

我有一个ViewPagerScrollView以及其他组件。当我给高度ViewPagerXML然后ScrollView正常工作,但我不能给ScrollView的高度,因为ViewPager应根据页面高度扩大。我已经实现了一个runnable,它将在运行时扩展ViewPagerViewPager滚动视图内

的问题是我不能滚动外ScrollView其持有的ViewPager

XML =======

<ScrollView 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
    <ImageView 
    android:src="@drawable/img1" 
    android:scaleType="fitXY" 
    android:layout_width="match_parent" 
    android:layout_height="150dp" 
    android:id="@+id/img_1" 
    /> 
<ViewPager 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content">   
</ViewPager> 
</ScrollView> 

JAVA动态设置高度viewpager

viewpager.post(new Runnable() { 
@Override 
public void run() { 
    ViewGroup.LayoutParams lp = viewpager.getLayoutParams(); 
    lp.height = viewpager.getChildAt(viewpager.getCurrentItem()).getHeight(); 
    viewpager.setLayoutParams(lp); 
} 

});

+0

请向我们提供您的代码,以帮助您 – Moudiz

+0

你也有办法做到这一点? – MiguelHincapieC

+0

nvm我知道了,看看[这个答案](http://stackoverflow.com/a/32410274/1332549) – MiguelHincapieC

回答

0

我认为你必须删除你的java代码。但将此属性添加到您的滚动视图xml:

android:fillViewport="true" 
+0

我猜viewPager内容是在运行时定义或下载,所以他不能使用fillViewport。 – MiguelHincapieC

0

回答此问题的方法是:Dynamic height viewpager

反正我要去给你,你需要解决它的代码:

public class CustomPager extends ViewPager { 

    private View mCurrentView; 

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

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

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (mCurrentView == null) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
      return; 
     } 
     int height = 0; 
     mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     int h = mCurrentView.getMeasuredHeight(); 
     if (h > height) height = h; 
     heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

    public void measureCurrentView(View currentView) { 
     mCurrentView = currentView; 
     requestLayout(); 
    } 

    public int measureFragment(View view) { 
     if (view == null) 
      return 0; 

     view.measure(0, 0); 
     return view.getMeasuredHeight(); 
    } 
} 

像老板的回答说:

ViewPager需要重新测量每个一次页面改变。好的地方做,这是PagerAdapter

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private List<Fragment> fragments; 
    private int mCurrentPosition = -1; 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
     this.fragments = new ArrayList<Fragment>(); 
     fragments.add(new FirstFragment()); 
     fragments.add(new SecondFragment()); 
     fragments.add(new ThirdFragment()); 
     fragments.add(new FourthFragment()); 
    } 

    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     super.setPrimaryItem(container, position, object); 
     if (position != mCurrentPosition) { 
      Fragment fragment = (Fragment) object; 
      CustomPager pager = (CustomPager) container; 
      if (fragment != null && fragment.getView() != null) { 
       mCurrentPosition = position; 
       pager.measureCurrentView(fragment.getView()); 
      } 
     } 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 
} 

的setPrimaryItem功能你可以找到所有代码here

相关问题