我MapFragment
里面的视差效果AppBarLayout
:
我想禁用滚动AppBarLayout
,因为无法在地图上移动,因为地图上的触摸偶数总是作为滚动事件处理.我想AppBarLayout
通过RecyclerView
仅滚动来处理折叠,这是在屏幕的底部.
这是我的xml:
感谢您的答复.
我不确定我得到了它,但我认为你正在寻找一个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.
问题
即使滚动内容适合屏幕,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
您可以通过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 }) } }
经过两个小时的尝试,我找到了一个解决方案,这非常简单.我只需要扩展CoordinatorLayout
和覆盖OnInterceptTouchEvent
方法,所以类看起来像这样:
public class NonTouchableCoordinatorLayout extends CoordinatorLayout { public NonTouchableCoordinatorLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; }
}