Android ViewPager 如何使当前项居中显示?

4
我正在尝试在屏幕上显示一个对话框,并希望该对话框中有一个带有FragmentPagerAdapter的ViewPager。适配器中的每个项目宽度设置为.7f。对我而言重要的是,当选择某个项目时,它应该被捕捉到ViewPager的中心,并且下一个和前一个片段的部分可见(正如图像所示)。不幸的是,默认行为是捕捉到左边。
请问是否有任何方法可以实现这一点?
谢谢
(如果有人问:在那张图片上,ViewPager没有延伸到对话框上。实际上,对话框匹配父宽度并进行布局,以便看起来不像这样)
2个回答

15

如果有人在寻找同样的解决方法,我已经找到了解决方案: 只需将ViewPager的左右内边距设置为相同值,然后将clipToPadding设置为false。这将使一个fragment居中,且相邻fragment的一部分会显示在两侧(如图片所示)。然后使用viewPager.setPageMargin()在代码中添加fragments之间的间隔。

就这样 :)

编辑://

以下是一些示例代码:

<android.support.v4.view.ViewPager
 android:id="@+id/viewPager"
 android:clipToPadding="false"
 android:paddingLeft="40dp"
 android:paddingRight="40dp"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

ClipToPadding=false确保即使片段位于viewPager的内容区域之外,它们也会被绘制。

然后在代码中在viewPager的项目之间添加空格:

mViewPager.setPageMargin(100);

请注意,setPageMargin方法的参数应该是像素数而不是显示点数。你可能需要将一些dp值转换为像素以在所有设备上获得正确的间距。这种方法应该可以正常工作:

public static float dipToPixels(Context context, float dipValue) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics);
}

1
加入一些代码示例会很好。如果您标记此答案,它肯定会帮助社区 - 这个问题不会出现在未解决的问题列表中。 - Sufian
1
谢谢你告诉我 :) 我已经按照你的建议完成了。 - bakua

0

我曾经遇到过类似的问题,但没有人尝试这种方法来解决。虽然可能不完全准确,但视觉上看起来是居中的。

使用DisplayMetrics获取设备高度尺寸,然后按以下方式设置您的viewpager的填充:

    int height = Resources.getSystem().getDisplayMetrics().heightPixels;

    pager.setPadding(0,height/6,0,0);

请注意,viewpager的项目布局必须设置为“wrap_content”,并且活动/片段中的viewpager高度必须为“match_parent”。
在我的情况下,将高度除以6作为顶部填充使其看起来居中。根据您的需要调整此数字以获得最佳效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接