当前位置:  开发笔记 > Android > 正文

如何禁用CoordinatorLayout中的AppBarLayout滚动?

如何解决《如何禁用CoordinatorLayout中的AppBarLayout滚动?》经验,为你挑选了4个好方法。

MapFragment里面的视差效果AppBarLayout:

在此输入图像描述

我想禁用滚动AppBarLayout,因为无法在地图上移动,因为地图上的触摸偶数总是作为滚动事件处理.我想AppBarLayout通过RecyclerView仅滚动来处理折叠,这是在屏幕的底部.

这是我的xml:




    

        

            
        

        

            
        

        
    




感谢您的答复.



1> natario..:

我不确定我得到了它,但我认为你正在寻找一个DragCallback.

DragCallback接口允许选择是否同级滚动视图应该通过滚动到被控制AppBarLayout.

你可以通过调用来定义一个:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
    @Override
    public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
        return false;
    }
});

通过始终返回false,您的滚动视图将不再受ABL控制.

注意:在调用之前你应该检查一下ViewCompat.isLaidOut(appBarLayout),否则params.getBehavior()将返回null.



2> Vasanth..:

问题

    即使滚动内容适合屏幕,AppBarLayout也会滚动.

    这是因为默认情况下我们可以通过触摸和拖动AppBarLayout来拖动AppBarLayout.

    我们将禁用AppBarLayout的"拖动"行为.

    // Disable "Drag" for AppBarLayout (i.e. User can't scroll appBarLayout by directly touching appBarLayout - User can only scroll appBarLayout by only using scrollContent)
    if (appBarLayout.getLayoutParams() != null) {
        CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
        AppBarLayout.Behavior appBarLayoutBehaviour = new AppBarLayout.Behavior();
        appBarLayoutBehaviour.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
            @Override
            public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
                return false;
            }
        });
        layoutParams.setBehavior(appBarLayoutBehaviour);
    }
    

参考

    这只是上述"natario"接受的答案的延伸.

    https://developer.android.com/reference/android/support/design/widget/AppBarLayout.Behavior.DragCallback.html



3> Victor Rendi..:

您可以通过app:layout_behavior在xml中定义自定义来完成此操作.使用这种方法,您不必担心获取对LayoutParams空检查的引用.

  

然后创建一个从中扩展的自定义类AppBarLayout.Behavior.

public class FixedAppBarLayoutBehavior extends AppBarLayout.Behavior {

  public FixedAppBarLayoutBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);

    setDragCallback(new DragCallback() {
      @Override public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
        return false;
      }
    });
  }
}

更新了Kotlin版本:

class FixedAppBarLayoutBehavior(context: Context, attrs: AttributeSet) : AppBarLayout.Behavior(context, attrs) {
  init {
    setDragCallback(object : DragCallback() {
      override fun canDrag(appBarLayout: AppBarLayout): Boolean = false
    })
  }
}



4> janox1x2x3..:

经过两个小时的尝试,我找到了一个解决方案,这非常简单.我只需要扩展CoordinatorLayout和覆盖OnInterceptTouchEvent方法,所以类看起来像这样:

public class NonTouchableCoordinatorLayout extends CoordinatorLayout {
public NonTouchableCoordinatorLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return false;
}

}

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有