ViewPager不能高度自適應?height=wrap_content 無效解決辦法

/*

http://my.oschina.net/lifj/blog/283346

*/


ViewPager用的不少,主要用啦展現廣告條。但是高度卻不能自適應內容,老是會佔滿全屏,即便設置android:height="wrap_content"也是沒有用的。。java

解決辦法其實網上有不少,可是我的感受不是很好android

好比:LinearLayout的時候,使用weight來自動調整ViewPager的高度。

通常的代碼以下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1.0" />

    <ImageView
        android:id="@+id/ivCursor"
        android:layout_width="60dp"
        android:layout_height="5dp"
        android:scaleType="fitCenter"
        android:src="@drawable/cursor" />

    <LinearLayout
        android:id="@+id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

這段代碼中,就用了weight來保證ViewPager始終佔滿屏幕的剩餘空間。若是ViewPager裏面的內容不須要那麼高,怎麼辦?這個方法就不行了。服務器

還好比:固定ViewPager的高度。height="100dp"。

這樣也不是很好。當服務器爲了保證圖片在不一樣dpi的手機上,不被縮放,返回的圖片高度也有可能不一樣,固定高度就形成了不能很好的適應這鐘變化。ide

在實際開發中,本人用的最多的就是經過LayoutParmas動態改變ViewPager的高度。

我的感受這個方法不錯還比較簡單。佈局

在給ViewPager設置View的時候,經過獲取view的高度,動態的設置ViewPager的高度等於view的高度,就OK了。
spa

int viewPagerIndex = main.indexOf(viewPager);
int childViewHeight = getChildViewHeight(); //獲取ViewPager的子View的高度。
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, childViewHeight );//這裏設置params的高度。
main.removeView(viewPager);
main.addView(viewPager, viewPagerIndex , params);//使用這個params


或者,直接繼承ViewPager,在onMeasure中返回childView的高度。

這樣佈局的時候,就會使用childView的高度了。思路和上面同樣。代碼以下:.net

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;

public class WrapContentHeightViewPager extends ViewPager {

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

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

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

		int height = 0;
		//下面遍歷全部child的高度
		for (int i = 0; i < getChildCount(); i++) {
			View child = getChildAt(i);
			child.measure(widthMeasureSpec,
					MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
			int h = child.getMeasuredHeight();
			if (h > height) //採用最大的view的高度。
				height = h;
		}

		heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
				MeasureSpec.EXACTLY);

		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
}
相關文章
相關標籤/搜索