L'autre, plus générique solution est d'obtenir de l' wrap_content
simplement.
Je l'ai étendu ViewPager
pour remplacer onMeasure()
. La hauteur est wraped autour de la première vue enfant. Cela pourrait conduire à des résultats inattendus si l'enfant vues ne sont pas exactement la même hauteur. Pour que la classe peut être facilement étendu à disons animer à la taille de la vue en cours/page. Mais je n'ai pas besoin de ça.
Vous pouvez utiliser cette ViewPager dans yout XML mises en page tout comme l'original ViewPager:
<view
android:layout_width="match_parent"
android:layout_height="wrap_content"
class="de.cybergen.ui.layout.WrapContentHeightViewPager"
android:id="@+id/wrapContentHeightViewPager"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"/>
Avantage: Cette approche permet à l'aide de la ViewPager dans n'importe quelle forme, y compris RelativeLayout superposer à d'autres éléments de l'interface utilisateur.
Un inconvénient demeure: Si vous souhaitez utiliser les marges, vous devez créer deux imbriqués mises en page et de donner à l'intérieur de la marge.
Voici le code:
public class WrapContentHeightViewPager extends ViewPager {
/**
* Constructor
*
* @param context the context
*/
public WrapContentHeightViewPager(Context context) {
super(context);
}
/**
* Constructor
*
* @param context the context
* @param attrs the attribute set
*/
public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// find the first child view
View view = getChildAt(0);
if (view != null) {
// measure the first child view with the specified measure spec
view.measure(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;
}
}