2015-05-26 4 views
1

У меня есть ViewPager Внутри ScrollView наряду с другими компонентами. Когда я даю высоту ViewPager в XML, тогда ScrollView работает нормально, но я не могу дать высоту для ScrollView, так как ViewPager должен расширяться в соответствии с высотой страницы. Я реализовал runnable, который будет расширять ViewPager во время выполнения.Viewpager внутри scrollview

Проблема в том, что я не в состоянии прокрутить наружный 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-код. но добавить эти свойства к вашему Scrollview 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 должен быть переоцениваются каждый время, когда страница изменяется. Хорошее место, чтобы сделать это setPrimaryItem функция 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(); 
    } 
} 

Вы можете найти код here

Смежные вопросы