父fragment和子fragment都有viewpager2,所以子fragment viewpager2的滚动无法正常工作

问题描述 投票:0回答:1

父片段包含 Viewpager2 ,子片段包含 viewpager2 ,当这个特定的子片段膨胀时,子片段 Viewpager2 滚动无法正常工作。

我有一个主要活动。在上面我有 8 个碎片要膨胀。 其中一个片段是 basemomentfragment。 这个 basemomentFragment 有一个 viewpager2 ,以及选项卡布局,以及一个用于扩展 FragmentStateAdapter 的 viewpager2 适配器。该适配器在 viewpager2 内膨胀 3 个子片段。 名为 videoFragment 的子片段之一在其整个视图中具有另一个 viewpager2 。 现在,当此视频片段到达屏幕时,视频片段中的 viewpager2 无法正确滚动。但父基时刻片段 viewpager2 工作正常。 问题是如何同时运行两个浏览器。 父 viewpager2 是水平的。 子viewpager是垂直的。

我已经尝试过 将父 viewpager2 设置为 binding.viewPagerParent.setUserInputEnabled(false); 但随后父级停止滚动并启用用户输入,它应该更改位置,但位置无法更改,因为它不接受用户输入。

实际上可以将父级 VIEWPAGER2 保留为 VIEWPAGER(旧),但我想使用 VIEWPAGER2。并且还想知道此问题的解决方案。

java android kotlin android-fragments android-viewpager2
1个回答
0
投票

在这个问题的研发之后。 我有适合我的用例的解决方案。 我创建了一个扩展 FrameLayout 的 customFrameLayout。 将其添加到子片段布局 XML 中。在 Custom Framelayout 中,我添加了 viewpager2。

            <com.zeeplive.app.gallery.ui.detail.adapter.CustomFrameLayout
            android:id="@+id/custom_fl_child"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/vp_detail_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="1.0" />
        </com.zeeplive.app.gallery.ui.detail.adapter.CustomFrameLayout>

这是 CustomFramLayout 的代码。

public class CustomFrameLayout extends FrameLayout {

private float initialX = 0;
private float initialY = 0;
private boolean isUserInputEnabled = true;
private OnSwipeDirectionChangeListener onSwipeDirectionChangeListener;

public interface OnSwipeDirectionChangeListener {
    void onSwipeDirectionChange(boolean isHorizontalSwipe);
}

public CustomFrameLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setOnSwipeDirectionChangeListener(OnSwipeDirectionChangeListener listener) {
    onSwipeDirectionChangeListener = listener;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            initialX = event.getX();
            initialY = event.getY();
            isUserInputEnabled = true; // Assume user input is initially enabled
            break;
        case MotionEvent.ACTION_MOVE:
            float deltaX = Math.abs(event.getX() - initialX);
            float deltaY = Math.abs(event.getY() - initialY);
            Log.e("test211", "deltaX :"+deltaX*0.15+" deltaY :"+deltaY);
            boolean isVerticalSwipe = deltaY > deltaX * 0.15; //  0.15 set it as per your sensitivty. test and try for you effective threshold value.
            if (onSwipeDirectionChangeListener != null) {
                onSwipeDirectionChangeListener.onSwipeDirectionChange(isVerticalSwipe);
            }

            if (!isVerticalSwipe) {
                // Horizontal swipe detected, disable user input
                isUserInputEnabled = false;
            }
            break;
    }
    // Return true to intercept events when user input is disabled
    return !isUserInputEnabled;
}

}

这是我在子片段中实现它的方式。

 binding.customFlChild.setOnSwipeDirectionChangeListener(new CustomFrameLayout.OnSwipeDirectionChangeListener() {
        @Override
        public void onSwipeDirectionChange(boolean isHorizontalSwipe) {
            Log.e("test211","innnnnnnn : "+isHorizontalSwipe);
            binding.vpDetailPager.setUserInputEnabled(isHorizontalSwipe);

            if(parentFragment!=null){
                ViewPager2 viewPager2 = parentFragment.getViewPager2();
                if(viewPager2!=null){
                    Log.e("test211","outttttttttt : "+!isHorizontalSwipe);
                    viewPager2.setUserInputEnabled(!isHorizontalSwipe);
                }
            }
            
        }
    });

Viewpager2 是 Viewpager 的父片段。 这是如何控制子片段 viewpager2 中的垂直滑动的方法,该子片段 viewpager2 在具有水平滑动的父片段 viewpager2 上膨胀。 对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.