父片段包含 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。并且还想知道此问题的解决方案。
在这个问题的研发之后。 我有适合我的用例的解决方案。 我创建了一个扩展 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 上膨胀。 对我有用。