2014-02-17 47 views
12

我不能让我的ViewPager不剪辑它的页面内容。不要剪辑ViewPager页面

我目前在我的应用程序中使用ViewPagerFragmentStatePagerAdapter。我有3页,每个页面显示不同的片段。 一切工作正常,但现在我希望能够在这个形象吸引我的网页范围之外,如:

What I Want

我在我所有的观点家长设置clipChildrenclipToPaddingfalse的观点,即需要吸引他们的边界,但这里是我得到的:我的意见根据页面边界被裁剪。

What I get

一些额外的信息:为了解决这个问题,我以前hierarchyviewer检查我的视图层次,看看一些“引擎盖下”的意见可能有一个剪辑的行为。宾果:我的每个片段的根视图都被添加到NoSaveStateFrameLayout下。我怀疑这个家伙要剪辑它的孩子...

我的最后一个假设在你看来是否正确?你会怎样做才能得到没有剪辑的页面?

回答

21

有一些需要禁用剪辑的不同视图。首先,位于ViewPager根部的FrameLayout需要禁用裁剪。无论您初始化视图寻呼机,都可以执行此操作。您还需要将屏幕外的页面限制设置为2,以允许在滑动过程中加载额外的片段。如果没有这个,你会看到1到2的弹出作为3个加载,并且一旦2完成加载(这会提前加载2和3),就会将溢出内容添加到2。

mViewPager.setClipChildren(false); 
mViewPager.setClipToPadding(false); 
mViewPager.setOffscreenPageLimit(2); 

其次,您在FragmentStatePagerAdapter中膨胀的XML需要包含适当的标签或可以通过编程方式完成。最后,你需要强制NoSaveStateFrameLayout不能被剪辑。这可以在onViewCreated中创建视图后完成。下面是一个示例片段:

public static class PlaceholderFragment extends Fragment { 

    public static PlaceholderFragment newInstance() { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     return fragment; 
    } 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     LinearLayout rootView = (LinearLayout) inflater.inflate(R.layout.fragment_main, container, false); 
     //This can be done in XML 
     rootView.setClipChildren(false); 
     rootView.setClipToPadding(false); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     //This is the NoSaveStateFrameLayout - force it to not clip 
     FrameLayout frameLayout = (FrameLayout) getView(); 
     frameLayout.setClipChildren(false); 
     frameLayout.setClipToPadding(false); 
    } 
} 

我测试了这个解决方案,并确定它的工作原理。

充分的活动例如: https://gist.github.com/grantamos/d664f01a30f9ad97ba53

+4

谢谢你非常感谢你的回答和你的时间。有效。 然而,它比这更复杂,因为我的ViewPager上有一个PageTransformer,但你不知道。 我将我的转换视图上的图层设置为NONE,它工作。 – LudovicL

+2

不客气!这是一个有趣的问题,所以我很乐意提供帮助。我以前从来没有做过这样的事情,所以工作起来非常酷。享受 –

+1

该Gist完整活动示例链接不起作用... – Ajay

0

您是否尝试过使用负值(使用ViewPager.setPageMargin(int))的页面之间的空白?您还必须将屏幕外页面限制设置为至少2(使用ViewPager.setOffscreenPageLimit(int))。

1

我有同样的问题。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:clipChildren="false" 
      android:clipToPadding="false" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <android.support.v4.view.ViewPager 
       android:clipChildren="false" 
       android:clipToPadding="false" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
     </LinearLayout> 
    </FrameLayout> 
</RelativeLayout> 

那么只有LinearLayoutViewPager应该有:我加入

android:clipChildren="false" 
android:clipToPadding="false" 

ViewPagerViewGroup这是ViewPager

例如父母,如果你有一个这样的布局解决了这个问题

android:clipChildren="false" 
android:clipToPadding="false"