2015-05-26 113 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

相關問題