【问题标题】:BottomSheetDialogFragment - Allow scrolling childBottomSheetDialogFragment - 允许滚动子项
【发布时间】:2016-12-01 07:19:48
【问题描述】:

我有一个BottomSheetDialogFragment 和一个RecyclerView。问题是,我想禁用BottomSheetDialogFragment 的拖动关闭功能,只要RecyclerView 没有向上滚动(目前我无法滚动我的RecyclerView,因为尝试将始终关闭BottomSheetDialogFragment) .任何想法如何实现这一目标?

【问题讨论】:

  • 您可以使用 NestedScrollView 作为 RecyclerView 的父级。它可能会有所帮助。
  • 这没有帮助。而RecyclerView 本身已经支持作为嵌套滚动视图本身...
  • 找到任何解决方案了吗?@prom85
  • 你找到解决办法了吗?如果是,请分享。

标签: android bottom-sheet


【解决方案1】:

BottomSheetDialog中RecyclerView的滚动问题可以通过这种方式解决。

来自:https://android.jlelse.eu/recyclerview-within-nestedscrollview-scrolling-issue-3180b5ad2542

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<android.support.v4.widget.NestedScrollView
        android:id="@+id/nestedScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</LinearLayout>

【讨论】:

  • 这是一种不好的做法。分页调用被无限调用。
  • @SharukhMohammed 这是正确的做法。在 recyclerView 中将 nestedScrollingEnabled 设置为 false 并使用嵌套滚动视图而不是 recyclerview 进行分页
【解决方案2】:

在您的 Fragment 中尝试此操作,在 onCreateView 中扩展 RecyclerView

recyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.getParent().requestDisallowInterceptTouchEvent(true);
        v.onTouchEvent(event);
        return true;
    }
});

【讨论】:

    【解决方案3】:

    只需在布局中添加一个 (!) 属性:

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/receiversList"
        android:nestedScrollingEnabled="false"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    android:nestedScrollingEnabled="false" 完成所有工作。 此外,如果您使用SwipeRefreshLayout 环绕您的RecyclerView - 刷新功能将继续工作。即使您使用更复杂的视图放置您的布局,您的BottomSheetDialog 也将继续支持向下拖动以关闭行为(如果在RecyclerViewSwipeRefreshLayout 之外使用向下滑动手势进行触摸)。

    【讨论】:

      【解决方案4】:

      只需将其视为 BottomSheetDialog ,并在触摸时禁用其拖动或滑动。

      当创建 BottomSheetDialog 时,它会自动将你的布局包装在一个CoordinatorLayout ,因此如果您想从视图中获取行为,请调用

      最终的 BottomSheetBehavior 行为 = BottomSheetBehavior.from((View) view.getParent());

      然后通过这种行为,你可以做你需要的。

      final BottomSheetBehavior behavior = BottomSheetBehavior.from((View) view.getParent());
          behavior.setHideable(false);
          behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
              @Override
              public void onStateChanged(@NonNull View bottomSheet, int newState) {
      
              }
      
              @Override
              public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                  behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
              }
          });
      

      这对我有用。希望它有所帮助。

      【讨论】:

      • 您的回答对于展开状态是正确的,但如果我将拖曳状态用于我的 bottomSheetDialog(折叠和展开),它就不起作用!
      • behavior.setHideable(false); 对我有帮助,它可以防止滚动底部工作表。但是,当用户点击后退按钮时,我会调用 behavior.setHideable(true);,这样我就可以调用 behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
      • 在我的情况下,它设置了一个奇怪的行为:当我滚动 NestedScrollView 时,BottomSheetDialog 反弹。我只是删除了BottomSheetBehaviorandroid:minHeight,然后NSV 可以滚动到BottomSheetDialog 的整个高度。
      【解决方案5】:

      当回收视图有滚动范围时,底部工作表将保持展开状态。但如果回收视图没有向上滚动,则从向上拖动将恢复正常行为。

               behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
      
                      behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                          @Override
                          public void onStateChanged(@NonNull View bottomSheet, int newState) {
                              if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                                  dismiss();
                              }
      
                              if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                                  if(!recyclerView.canScrollVertically(1)) {
                                      behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                                  }
                              }
                          }
      
                          @Override
                          public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                          }
                      });
      

      【讨论】:

      • 当回收站视图有很多项目(填充高度)时工作。但是如果我只有几个项目,我会卡在展开状态,无法向下滚动以将其最小化。
      【解决方案6】:

      试试这个解决方案:

          <androidx.core.widget.NestedScrollView
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <LinearLayout
              android:id="@+id/layout_form"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical" >
      
          <!-- elements-->
          <!-- elements-->
      
          </LinearLayout>
      
      </androidx.core.widget.NestedScrollView>
      

      【讨论】:

        【解决方案7】:

        在 setupDialog 方法中更改 BottomSheetDialogFragment 中的 Behavior:

        CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
                final CoordinatorLayout.Behavior behavior = layoutParams.getBehavior();
                if (behavior != null && behavior instanceof BottomSheetBehavior) {
                    ((BottomSheetBehavior) behavior).setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                        @Override
                        public void onStateChanged(@NonNull View bottomSheet, int newState) {
                            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                                dismiss();
                            }
        
                            if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                                ((BottomSheetBehavior) behavior).setState(BottomSheetBehavior.STATE_EXPANDED);
                            }
        
        
                        }
        
                        @Override
                        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        
                        }
                    });
                }
        

        【讨论】:

        • 这将完全禁用关闭拖动功能,但我可以检查 RecyclerView 是否也滚动到顶部,那么这应该可以工作
        【解决方案8】:

        我遇到了同样的情况,对我有用的只是onCreate 函数中的一行代码。 你要做的就是启用 recyclerViews 嵌套滚动。

        recyclerView.setNestedScrollingEnabled(true);
        

        【讨论】:

          【解决方案9】:

          带约束布局

          <androidx.recyclerview.widget.RecyclerView
                      android:id="@+id/rv_team_mates"
                      android:layout_width="@dimen/dp_0"
                      android:layout_height="@dimen/dp_0"
                      android:layout_marginVertical="@dimen/dp_20"
                      app:layout_constraintEnd_toEndOf="parent"
                      app:layout_constraintStart_toStartOf="parent"
                      app:layout_constraintTop_toBottomOf="@id/txt_title_custom"
                      app:layout_constraintBottom_toBottomOf="parent"/>
          

          【讨论】:

          • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
          【解决方案10】:

          将您的RecyclerView 放在NestedScrollView 下,其中 NestedScroll 是回收器的父级

          【讨论】:

          • 这不会有任何不同,仍然关闭片段!!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-07
          相关资源
          最近更新 更多