不要剪辑ViewPager页面

Lud*_*icL 15 android android-fragments android-viewpager

我无法得到我的ViewPager剪辑页面内容.

我目前使用ViewPagerFragmentStatePagerAdapter我的应用程序.我有3页,每页都显示不同的片段.一切正常,但现在我希望能够在我的页面边界之外绘制,如下图所示:

我想要的是

我设置clipChildrenclipToPaddingfalse我的所有视图父母需要他们的边界之外画,但这里是我得到的观点:我的观点得到根据页面边界裁剪.

我得到了什么

一些额外的信息:为了解决这个问题,我曾经hierarchyviewer检查过我的视图层次结构,看看是否有一些"引擎盖下"视图可能有剪切行为.和宾果游戏:我的每个片段的根视图都添加到了一个NoSaveStateFrameLayout.我怀疑这个家伙会把孩子夹住......

你认为我的最后一个假设是否正确?如何获取未剪辑的页面?

Gra*_*mos 27

有一些不同的视图需要禁用剪辑.首先,位于ViewPager根目录的FrameLayout需要禁用剪辑.您可以在初始化视图寻呼机的任何地方执行此操作.您还需要将屏幕外页面限制设置为2,以允许在滑动期间加载额外的片段.如果没有这个,你会看到一个弹出从1-> 2作为3次加载,并在2加载完成后将其溢出内容添加到2(这会提前加载2和3).

mViewPager.setClipChildren(false);
mViewPager.setClipToPadding(false);
mViewPager.setOffscreenPageLimit(2);
Run Code Online (Sandbox Code Playgroud)

其次,您在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个解决方案并确定它有效.

完整活动示例:https: //gist.github.com/grantamos/d664f01a30f9ad97ba53

  • 非常感谢你的回答和时间.有效.然而,它比这更复杂,因为我的ViewPager上有一个PageTransformer,但你不知道.我将转换后的View上的图层设置为NONE,然后就可以了. (5认同)
  • 别客气!这是一个有趣的问题,所以我很乐意提供帮助.我以前从来没有做过这样的事情所以很好地解决了这个问题.请享用 (2认同)
  • 也有一个PageTransformer,你的评论帮助了LudovicL.谢谢.对于遇到相同问题的其他问题,只需在PageTransformer的transformPage方法中设置`page.setLayerType(View.LAYER_TYPE_NONE,null);`. (2认同)