【问题标题】:Do not clip ViewPager pages不要剪辑 ViewPager 页面
【发布时间】:2019-10-17 13:51:05
【问题描述】:

我无法让我的ViewPager 不剪切其页面内容。

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

我在我的所有视图中将clipChildrenclipToPadding 设置为false,以设置需要在其范围之外绘制的视图,但这是我得到的:我的视图会根据页面边界被剪裁。

一些附加信息:为了解决这个问题,我使用hierarchyviewer 检查我的视图层次结构并查看某些“幕后”视图是否可能具有剪切行为。还有宾果游戏:我的每个片段的根视图都添加在NoSaveStateFrameLayout 下。我怀疑这家伙夹它的孩子...

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

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

    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

    【讨论】:

    • 非常感谢您的回答和您的时间。有效。然而,它比这更复杂,因为我的 ViewPager 上有一个 PageTransformer,但你不知道。我将转换后的视图上的图层设置为 NONE,并且它起作用了。
    • 不客气!这是一个有趣的问题,所以我很乐意提供帮助。我以前从来没有做过这样的事情,所以很酷。享受
    • 对我来说,这适用于除 4.1.2 之外的所有 Android 版本。在那个版本上,如果视图没有通常在视图中的部分,则根本不会绘制它。所有其他版本都允许我从一个片段在另一个片段上绘制视图而不会出现问题。
    • 也有一个 PageTransformer,您的评论帮助了 LudovicL。谢谢。对于遇到相同问题的其他人,只需在 PageTransformer 的 transformPage 方法中设置 page.setLayerType(View.LAYER_TYPE_NONE, null);
    • 我得到了它的工作,但也有一个PageTransformer。现在来自CardView 项目的高程阴影工作非常不稳定,在每个项目上都重复。卸下变压器可以解决它。将 layertype 设置为 none 不起作用。
    【解决方案2】:

    我遇到了同样的问题。我通过添加解决了这个问题

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

    ViewPagerViewGroup 这是ViewPager 的父级

    例如,如果您有这样的布局:

    <?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"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        试试这个:

        @Override
            public float getPageWidth(int position) {
                return 0.80f;
            }
        

        【讨论】:

          【解决方案5】:

          这对我来说非常有用

          1.  (Parent Layouts).setClipChildren(false);
              (Parent Layouts).setClipToPadding(false);
          
          2. `mViewPager.setPagerMargin(dp)`
          3. `mViewPager.setOffscreenPageLimit(numberOfPage);`
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-28
            • 1970-01-01
            相关资源
            最近更新 更多