ViewPager
是否必须是活动布局中唯一存在的对象?
我正在尝试实现这样的事情:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reader_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/page_viewer"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Gallery
android:id="@+id/miniatures_gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content" /></LinearLayout>
我应该在哪里有一个大的寻呼机滚动在顶部(我有它)和一个较小的画廊在其下滚动。 这只显示了寻呼机,而不是画廊。 有什么建议吗?
答案 0 :(得分:6)
ViewPager不支持wrap_content
,因为它(通常)从不会同时加载所有子项,因此无法获得适当的大小(选项是每个都有一个更改大小的寻呼机你换页的时间。)
但是,您可以设置精确尺寸(例如150dp)和match_parent
您还可以通过更改height
中的LayoutParams
- 属性,从代码中动态修改维度。
答案 1 :(得分:4)
指定布局权重以查看寻呼机为1&amp; height = 0dp而不是wrap_content
<android.support.v4.view.ViewPager
android:id="@+id/page_viewer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
答案 2 :(得分:0)
我用几个黑客解决了这个问题。以下是它涉及的内容:
首先,我需要一个忽略ViewPager
高度限制的布局。将其用作ViewPager
项的父布局。
public class TallLinearLayout extends LinearLayout {
public TallLinearLayout(Context context) {
super(context);
}
public TallLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TallLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.UNSPECIFIED);
}
}
然后我编写了调整ViewPager大小的逻辑:
private class ViewPagerContentWrapper implements OnGlobalLayoutListener {
private ViewPager mViewPager;
public ViewPagerContentWrapper(ViewPager viewPager) {
mViewPager = viewPager;
}
@Override
public void onGlobalLayout() {
int position = mViewPager.getCurrentItem();
check(position);
check(position + 1);
}
private void check(int position) {
ViewGroup vg = (ViewGroup) mViewPager.getChildAt(position);
View v = vg == null ? null : vg.getChildAt(0);
if (v != null) {
int height = v.getHeight();
if (height > mViewPager.getHeight()) {
resize(height);
}
}
}
private void resize(int height) {
mViewPager.setLayoutParams(
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
height
)
);
}
}
我注册为全局布局侦听器:
viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewPagerContentWrapper(viewPager));