ViewPager not working if set layout_height = wrap_content

匿名 (未验证) 提交于 2019-12-03 08:42:37

问题:

I got issues when worked with ViewPaper. It doesn't show anything when I set ViewPaper's height = wrap_content and it shows if I set height for ViewPager (ex: android:layout_height= "350dp"). Please help! Thanks!

This is my xml code:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="@color/white"     android:orientation="vertical" >      <ScrollView         android:id="@+id/scrollView"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:fillViewport="true"         android:scrollbars="none" >          <LinearLayout             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:orientation="vertical" >              <TextView                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 android:layout_gravity="center"                 android:background="#FF0000"                 android:gravity="center"                 android:text="Quick Links"                 android:textColor="@color/white"                 android:textSize="20sp" />              <RelativeLayout                 android:layout_width="match_parent"                 android:layout_height="wrap_content" >                  <android.support.v4.view.ViewPager                     android:id="@+id/pager"                     android:layout_width="match_parent"                     android:layout_height="wrap_content" >                 </android.support.v4.view.ViewPager>                  <com.viewpagerindicator.CirclePageIndicator                     android:id="@+id/circlePage"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     android:layout_alignBottom="@+id/pager"                     android:layout_marginBottom="10dp" >                 </com.viewpagerindicator.CirclePageIndicator>             </RelativeLayout>              <com.custom.ExpandableHeightListView                 android:id="@+id/lvAdmissions"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:background="@color/white"                 android:divider="@drawable/bg_listview_divider"                 android:dividerHeight="1dp"                 android:listSelector="@drawable/selector_animation" >             </com.custom.ExpandableHeightListView>         </LinearLayout>     </ScrollView>  </LinearLayout> 

Resolved: I follow this link and it help me resolved this issues. https://stackoverflow.com/a/24666987/1928560

回答1:

ViewPager height must either be specified match_parent or you must specify a value for it. Two solutions,

  1. Use weights concept inside LinearLayout or
  2. Use onMeasure method in your class file. Refer Android: I am unable to have ViewPager WRAP_CONTENT

This is how you can use weights in your LinearLayout

  <LinearLayout         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:orientation="vertical" >          <TextView             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_gravity="center"             android:background="#FF0000"             android:gravity="center"             android:text="Quick Links"             android:textColor="@color/white"             android:textSize="20sp" />          <RelativeLayout             android:layout_width="match_parent"             android:layout_height="0dp"             android:layout_weight="1">              <android.support.v4.view.ViewPager                 android:id="@+id/pager"                 android:layout_width="match_parent"                 android:layout_height="match_parent" >             </android.support.v4.view.ViewPager>              <com.viewpagerindicator.CirclePageIndicator                 android:id="@+id/circlePage"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 android:layout_alignBottom="@+id/pager"                 android:layout_marginBottom="10dp" >             </com.viewpagerindicator.CirclePageIndicator>         </RelativeLayout>          <com.custom.ExpandableHeightListView             android:id="@+id/lvAdmissions"             android:layout_width="match_parent"             android:layout_height="0dp"             android:layout_weight="1"             android:background="@color/white"             android:divider="@drawable/bg_listview_divider"             android:dividerHeight="1dp"             android:listSelector="@drawable/selector_animation" >         </com.custom.ExpandableHeightListView>     </LinearLayout> 

This way your viewpager layout and ExpandableListView shares equal height. You can change the ratio by changing the weight value



回答2:

=>100% working when viewpager height set wrap_content.

public class FollowUseWrapHeightViewPager extends ViewPager { public FollowUseWrapHeightViewPager(Context context) {     super(context); }  public FollowUseWrapHeightViewPager(Context context, AttributeSet attrs) {     super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     int height = 0;     View view = null;     for(int i = 0; i < getChildCount(); i++) {         view = getChildAt(i);         view.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));         int h = view.getMeasuredHeight();         if(h > height) height = h;     }      if (height != 0) {         heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);     }      super.onMeasure(widthMeasureSpec, heightMeasureSpec);      setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view)); }  /**  * Determines the height of this view  *  * @param measureSpec A measureSpec packed into an int  * @param view the base view with already measured height  *  * @return The height of the view, honoring constraints from measureSpec  */ 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; } } 


回答3:

Hye there , i am also using this, Kindly give it a try and see if it solves your problem.

<LinearLayout     android:id="@+id/container_app_bar"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:orientation="vertical">     <android.support.v4.view.ViewPager         android:id="@+id/viewPager"         android:layout_width="match_parent"         android:layout_height="0dp"         android:layout_weight="1" /> </LinearLayout> 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!