Android ViewPager 页面片段之间的 padding/ margin

65

Android市场/谷歌音乐似乎能够在包含于ViewPager中的不同片段之间留有一定的间隙。

有什么想法是如何完成这个效果的吗?将间距/填充添加到实际片段视图上并不起作用,因为该视图仍然需要占据整个屏幕的宽度。当滑动ViewPager时,“间隙”才会显示出来。

7个回答

128

支持包r4中,您可以使用以下方法:

setPageMargin(int marginPixels)
setPageMarginDrawable(Drawable)
setPageMarginDrawable(int)

ViewPager类中。

我不知道为什么这没有相应的XML代码 :-(

如果你需要使用dip单位,可以使用这个方法:

public static int convertDip2Pixels(Context context, int dip) {
    return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, context.getResources().getDisplayMetrics());
}

16
对于将 dp 转换为 px,我更喜欢使用更简洁的 Context.getResources().getDimensionPixelOffset(int dimenId) 方法。 - greg7gkb
执行Context.getResources().getDimensionPixelOffset(int dimenId)时出现资源未找到的错误。维度的ID是正确的,但它无法正常工作。 - Jono
使用适配器引用而不是上下文。 - Kaveesh Kanwal

24
希望这能帮助一些使用ViewPager和页面边距的人。
我想在一个CardView中放置一个ViewPager,并且在viewpager页面之间有padding和margin的问题。setPageMargin对我没有用。我必须使用以下代码:
int pagerPadding = 16;
pager.setClipToPadding(false);
pager.setPadding(pagerPadding, 0, pagerPadding, 0);

这使得页面非常紧凑。

带有页面之间小间距的viewpager示例。


7
  viewPager.setPageMargin(dpToPx(10)); 
  // replace 10 with the value you want for margin in dp. 


 public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getActivity().getResources().getDisplayMetrics();
    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
 }

5

试一下这个。

    ViewPager viewPager = (ViewPager) findViewById(R.id.h_view_pager);
    viewPager.setClipToPadding(false);
    viewPager.setPadding(60, 0, 60, 0);
    viewPager.setPageMargin(20);
    ImagePagerAdapter adapter = new ImagePagerAdapter();
    viewPager.setOffscreenPageLimit(adapter.getCount());
    viewPager.setAdapter(adapter);

2

如果您需要在ViewPager中的两个页面之间添加间距,则可以使用以下方法:

pager.setClipToPadding(false);

pager.setPadding(left,0,right,0);

然后添加以下代码:

pager.setPageMargin(int);


1

试试这个

    viewPager.setClipToPadding(false);
    viewPager.setOffscreenPageLimit(2);
    viewPager.setPadding(20, 0, 20, 0);

0
这是一个示例解决方案:
在您使用 ViewPager 的活动或片段中实现 ViewPager.OnPageChangeListener
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        int tabStripChildCount = mTabStrip.getChildCount();

        for (int i=0 ; i < tabStripChildCount ; i++){
            View view = mTabStrip.getChildAt(i);

            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            p.setMargins(0, 0, 50, 0);
            view.requestLayout();
        }
    }

mTabStrip 是你的活动或片段中的表格布局

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
    View view =  inflater.inflate(R.layout.patient_activity__fragment_tab_viewer, container, false);

    mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 
    mViewPager.setAdapter(mSectionsPagerAdapter);

    mTabStrip = (SlidingTabLayout) view.findViewById(R.id.tabs);

    mTabStrip.setViewPager(mViewPager);
    return view;
}

最终,您的标题片段之间将有一个边距


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