2013-11-15 3 views
7

Я должен показать viewpager (изображение и текст под изображением в строке пейджера) внутри прокрутки. Я загружаю изображение, текст из Интернета и показываю в строках пейджера. Я завернул viewpager внутри srollview, чтобы поддерживать ландшафтный режим.Установить высоту Viewpager внутри Scrollview в android

<com.xxx.myapp.android.ui.CustomScrollView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:fadingEdge="none" 
    android:fillViewport="true" 
    android:gravity="center"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:descendantFocusability="blocksDescendants" 
     android:orientation="vertical" > 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewPager" 
      android:layout_width="match_parent" 
      android:layout_height="800dp" 
      android:layout_gravity="top" 
      android:layout_marginTop="10dp" /> 
    </LinearLayout> 
</com.xxx.myapp.android.ui.CustomScrollView> 

И вот CustomScrollView. Проблема заключается в том, как настроить высоту пейджера представления на основе высоты его детей, чтобы я мог прокручивать экран до тех пор, пока не будет только объект пейджера. Если я установил высоту представления пейджера в wrapcontent, в viewpager ничего не отображается. Если я установил 800dp, то я увижу элементы пейджера, но на экране нет необходимости прокручивать. Я не хочу, чтобы прокрутка была прокручена за пределы высоты пейджера. Пожалуйста, помогите мне.

+0

Не указывать размер высоты для просмотра пейджера .. – Piyush

+0

Вы решили? Облицовка одной и той же проблемы –

+0

@ Гайтри, пожалуйста, поделитесь классом com.xxx.myapp.android.ui.CustomScrollView –

ответ

-1

обернуть пейджера строку внутри CustomScrollView вместо оберточной пейджера внутри CustomScrollview. И не фиксируйте высоту Viewpager, как прокомментировал Пиюш Гупат. Используйте wrapcontent.

3

Попробуйте этот путь

<com.xxx.myapp.android.ui.CustomScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:fadingEdge="none" 
    android:fillViewport="true" 
    android:gravity="center"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:descendantFocusability="blocksDescendants" 
     android:orientation="vertical" > 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewPager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="top" 
      android:layout_marginTop="10dp" /> 
    </LinearLayout> 
</com.xxx.myapp.android.ui.CustomScrollView> 
+2

Спасибо, android: fillViewport = "true" работал для меня. – Justin

9
mViewPager = new ViewPager(mContext) { 
     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

      View view = getChildAt(this.getCurrentItem()); 
      if (view != null) { 
       view.measure(widthMeasureSpec, heightMeasureSpec); 
      } 
      setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view)); 
     } 

     private int measureHeight(int measureSpec, View view) { 
      int result = 0; 
      int specMode = MeasureSpec.getMode(measureSpec); 
      int specSize = MeasureSpec.getSize(measureSpec); 

      if (specMode == MeasureSpec.EXACTLY) { 
       result = specSize; 
      } else { 
       // set the height from the base view if available 
       if (view != null) { 
        result = view.getMeasuredHeight(); 
       } 
       if (specMode == MeasureSpec.AT_MOST) { 
        result = Math.min(result, specSize); 
       } 
      } 
      return result; 
     } 
    }; 
+0

безупречный! спасибо –

16

Чтобы исправить высоту зрителя, мы можем настроить класс viewpager.

public class WrapContentViewPager extends ViewPager { 

private int mCurrentPagePosition = 0; 

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

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

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    try { 
     View child = getChildAt(mCurrentPagePosition); 
     if (child != null) { 
      child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
      int h = child.getMeasuredHeight(); 
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

public void reMeasureCurrentPage(int position) { 
    mCurrentPagePosition = position; 
    requestLayout(); 
} 
} 

где это reMeasureCurrentPage должен быть вызван в ViewPager onPageSelected callback.and CustomScrollView является родительским видом.

+1

Мне нужен viewpager с высотой его текущего показывающего ребенка. Это идеальное решение среди множества ответов на SOF. – Santhosh

+0

Отлично! Спасибо! – Madi

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