Android Fragments 父片段和子片段都具有viewpager2,因此子片段viewpager2的滚动无法正常工作

xriantvc  于 2023-11-19  发布在  Android
关注(0)|答案(1)|浏览(151)

父片段包含Viewpager 2,子片段包含Viewpager 2,当这个特定的子片段膨胀时,子片段Viewpager 2滚动无法正常工作。
我有一个主活动。我有8个片段要膨胀。其中一个片段是basemomentfragment。这个basemomentFragment有一个viewpager 2,沿着标签布局,以及一个用于viewpager 2扩展FragmentStateAdapter的适配器。这个适配器在viewpager 2中膨胀了3个子片段。其中一个名为videoFragment的子片段在其整个视图中有另一个viewpager 2。现在,当这个videoFragment到达在屏幕上,videosfragment中的viewpager 2不能正确滚动。但是父viewpager 2工作正常。问题是如何同时运行两个VIEWPAGER。父viewpager 2是水平的。子viewpager 2是垂直的。
我已经尝试保持父viewpager 2设置为binding.viewPagerParent.setUserInputEnabled(false);但然后父停止滚动,并启用用户输入,它应该改变位置,但位置不能改变,因为没有它不接受用户输入。
它实际上工作与保持pagesviewpager 2作为VIEWPAGER(旧),但我想使用VIEWPAGER2.AND也想知道这个问题的解决方案。

lnxxn5zx

lnxxn5zx1#

在这个问题的研发之后。我有了我的用例的解决方案。我创建了一个扩展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上膨胀。适合我。

相关问题