滚动不适用于BottomSheet中的多个RecyclerView

You*_* Qi 15 android bottom-sheet

BottomSheet使用这种DialogFragment方法实现了.我有一个TabLayoutViewPagerBottomSheet.该ViewPager托管2页,每一个膨胀RecyclerView.第一个(咖啡标签)RecyclerView滚动很好.我现在遇到的问题是,对于第二个(Milk选项卡),滚动不起作用.知道我该如何解决这个问题?谢谢!

您可以使用我在这里创建的演示项目进行测试:https:// github.com/choongyouqi/ bottomsheet`

在此输入图像描述

Had*_*adi 8

将此视图用作根视图:

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class DisallowInterceptView extends LinearLayout {
    public DisallowInterceptView(Context context) {
        super(context);
        requestDisallowInterceptTouchEvent(true);
    }

    public DisallowInterceptView(Context context, AttributeSet attrs) {
        super(context, attrs);
        requestDisallowInterceptTouchEvent(true);
    }

    public DisallowInterceptView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        requestDisallowInterceptTouchEvent(true);
    }


    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                requestDisallowInterceptTouchEvent(false);
                break;
        }
        return super.onTouchEvent(event);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在用于 bottmSheet 的布局中:

<?xml version="1.0" encoding="utf-8"?>
<com.your.package.DisallowInterceptView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:maxHeight="400dp"
    android:minHeight="300dp"
    android:orientation="vertical"
    >

    ...
</LinearLayout>

</com.your.package.DisallowInterceptView>
Run Code Online (Sandbox Code Playgroud)


lae*_*ger 7

正如R.Zagórski所提到的,我在这里描述了这种滚动行为的原因,即BottomSheetBehavior只支持一个滚动子项.然而,这个答案并没有集中在底部对话框上.

因此 - 就像R.Zagórski一样 - 我扩展了我自己的,克服了这个限制.从0.0.3开始,支持底部对话框!您可以在此处找到库和示例应用程序:https: //github.com/laenger/ViewPagerBottomSheet

要在项目中使用,只需将maven repo url添加到build.gradle:

repositories {
    maven { url "https://raw.github.com/laenger/maven-releases/master/releases" }
}
Run Code Online (Sandbox Code Playgroud)

将库添加到依赖项:

dependencies {
    compile "biz.laenger.android:vpbs:0.0.3"
}
Run Code Online (Sandbox Code Playgroud)

使用ViewPagerBottomSheetDialogFragment作为对话片段超类.然后在内容视图中设置任何ViewPager:

public class DialogFragment extends ViewPagerBottomSheetDialogFragment {
    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        final View contentView = View.inflate(getContext(), R.layout.dialog_bottom_sheet, null);

        final ViewPager viewPager = (ViewPager) contentView.findViewById(R.id.viewpager);
        // ...
        BottomSheetUtils.setupViewPager(viewPager);

        dialog.setContentView(contentView);
    }
}
Run Code Online (Sandbox Code Playgroud)

样本实施


R. *_*ski 6

在尝试在 StackOverflow 上查找问题时,我发现了这个线程。它描述了错误(至少我是这么看的),BottomSheetBehaviour它只适用于它找到的第一个可滚动子项。它还提出了不同的CoordinatorLayout.Behavior建议和发布在这里的用法。

但是,您的情况有点不同。BottomSheetDialogFragment用来。这就是提供的解决方案不起作用的地方。但是,我设法克服了这个问题。已发布的存储库,您的项目被修改为可以在其中工作。它使用ViewPagerBottomSheetBehavior前面提到的库中的 。

基本上,进行了以下更改:

  1. StatisticFragment扩展ViewPagerBottomSheetDialogFragment而不是BottomSheetDialogFragment
  2. StatisticsFragment更改了onCreateDialog 函数:

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        ViewPagerBottomSheetDialog dialog = (ViewPagerBottomSheetDialog) super.onCreateDialog(savedInstanceState);
        View rootView = View.inflate(getContext(), R.layout.sheet_main, null);
        viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
        tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
        dialog.setContentView(rootView);
        mBehavior = ViewPagerBottomSheetBehavior.from((View) rootView.getParent());
        mBehavior.setPeekHeight(400);
        if (viewPager != null && tabLayout != null) {
            initViewPager();
        }
        return dialog;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 上调用以下函数ViewPager

    BottomSheetUtils.setupViewPager(viewPager);
    
    Run Code Online (Sandbox Code Playgroud)

这就是全部。该项目有效。

以下是在幕后完成的:

BottomSheetDialogFragment 只有一种方法:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new BottomSheetDialog(getContext(), getTheme());
}
Run Code Online (Sandbox Code Playgroud)

BottomSheetDialog返回。但是,它的静态定义行为设置为BottomSheetBehavior。需要的是覆盖ViewPagerBottomSheetDialogFragment以返回ViewPagerBottomSheetDialogCoordinatorLayout.Behavior设置为ViewPagerBottomSheetBehavior. 此外,BottomSheet需要覆盖自定义以适应ViewPagerBottomSheetBehavior.