注意:阅读底部的编辑
好的,我已经找到了一种方法,但我必须更改多个类的代码,以便底部的表格知道appBarLayout的状态(是否展开),如果它是的话,忽略向上滚动没有扩大:
添加字段:
private AppBarLayout mAppBarLayout; private OnOffsetChangedListener mOnOffsetChangedListener; private int mAppBarLayoutOffset;
init() - 添加了这个:
mOnOffsetChangedListener = new OnOffsetChangedListener() { @Override public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) { mAppBarLayoutOffset = verticalOffset; } };
添加了设置appBarLayout的功能:
public void setAppBarLayout(final AppBarLayout appBarLayout) { if (mAppBarLayout == appBarLayout) return; if (mAppBarLayout != null) mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener); mAppBarLayout = appBarLayout; mAppBarLayout.addOnOffsetChangedListener(mOnOffsetChangedListener); }
onDetachedFromWindow() - 添加了这个:
if (mAppBarLayout != null) mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);
onTouchEvent() - 添加了这个:
... if (bottomSheetOwnsTouch) { if (state == State.EXPANDED && scrollingDown && mAppBarLayout != null && mAppBarLayoutOffset != 0) { event.offsetLocation(0, sheetTranslation - getHeight()); getSheetView().dispatchTouchEvent(event); return true; } ...
那是主要的变化.现在为他们设置:
MyFragment.java
onCreateView() - 添加了这个:
mBottomSheetLayout.setAppBarLayout((AppBarLayout) view.findViewById(R.id.appbar));
我还添加了这个功能:
public void setBottomSheetLayout(final BottomSheetLayout bottomSheetLayout) { mBottomSheetLayout = bottomSheetLayout; }
现在,这是活动告诉片段关于appBarLayout的方式:
final MyFragment myFragment = new MyFragment(); myFragment.setBottomSheetLayout(bottomSheetLayout); myFragment.show(getSupportFragmentManager(), R.id.bottomsheet);
项目现在可以在GitHub上获得:
https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet
我希望它没有任何错误.
遗憾的是,解决方案存在错误,因此我不会将此答案标记为正确答案:
它仅适用于Android 6及更高版本.其他人有一种奇怪的行为,即每次显示时,底片都会膨胀一小部分时间.
方向更改根本不保存滚动状态,所以我已禁用它.
罕见的问题是,当它仍在折叠时(在底部)能够滚动底部内容的内容
如果之前显示过键盘,则在尝试偷看时,底部工作表可能会全屏显示.
如果有人可以提供帮助,请这样做.
对于问题#1,我尝试通过在未查看底部工作表时将可见性设置为INVISIBLE来添加修复,但它并不总是有效,尤其是在显示键盘的情况下.
对于问题#1,我已经找到了如何修复它,只需将CoordinatorLayout包装(在"fragment_my.xml"中)与你想要使用的任何视图(我使用FrameLayout),并且还放入一个完整大小的视图它(我只是把"视图"),因此:
<...CollapsingToolbarLayout ...
当我将CoordinatorLayout视为其视图时,它可能会混淆bottomSheet.我已经更新了项目,但是,如果有任何方法可以提供更好的解决方案,我想知道它.
最近几个月,Google已经发布了自己的bottomSheet类,但是我发现它有很多问题,所以我甚至无法尝试.
注意:阅读底部的编辑
好的,我已经找到了一种方法,但我必须更改多个类的代码,以便底部的表格知道appBarLayout的状态(是否展开),如果它是的话,忽略向上滚动没有扩大:
添加字段:
private AppBarLayout mAppBarLayout; private OnOffsetChangedListener mOnOffsetChangedListener; private int mAppBarLayoutOffset;
init() - 添加了这个:
mOnOffsetChangedListener = new OnOffsetChangedListener() { @Override public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) { mAppBarLayoutOffset = verticalOffset; } };
添加了设置appBarLayout的功能:
public void setAppBarLayout(final AppBarLayout appBarLayout) { if (mAppBarLayout == appBarLayout) return; if (mAppBarLayout != null) mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener); mAppBarLayout = appBarLayout; mAppBarLayout.addOnOffsetChangedListener(mOnOffsetChangedListener); }
onDetachedFromWindow() - 添加了这个:
if (mAppBarLayout != null) mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);
onTouchEvent() - 添加了这个:
... if (bottomSheetOwnsTouch) { if (state == State.EXPANDED && scrollingDown && mAppBarLayout != null && mAppBarLayoutOffset != 0) { event.offsetLocation(0, sheetTranslation - getHeight()); getSheetView().dispatchTouchEvent(event); return true; } ...
那是主要的变化.现在为他们设置:
MyFragment.java
onCreateView() - 添加了这个:
mBottomSheetLayout.setAppBarLayout((AppBarLayout) view.findViewById(R.id.appbar));
我还添加了这个功能:
public void setBottomSheetLayout(final BottomSheetLayout bottomSheetLayout) { mBottomSheetLayout = bottomSheetLayout; }
现在,这是活动告诉片段关于appBarLayout的方式:
final MyFragment myFragment = new MyFragment(); myFragment.setBottomSheetLayout(bottomSheetLayout); myFragment.show(getSupportFragmentManager(), R.id.bottomsheet);
项目现在可以在GitHub上获得:
https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet
我希望它没有任何错误.
遗憾的是,解决方案存在错误,因此我不会将此答案标记为正确答案:
它仅适用于Android 6及更高版本.其他人有一种奇怪的行为,即每次显示时,底片都会膨胀一小部分时间.
方向更改根本不保存滚动状态,所以我已禁用它.
罕见的问题是,当它仍在折叠时(在底部)能够滚动底部内容的内容
如果之前显示过键盘,则在尝试偷看时,底部工作表可能会全屏显示.
如果有人可以提供帮助,请这样做.
对于问题#1,我尝试通过在未查看底部工作表时将可见性设置为INVISIBLE来添加修复,但它并不总是有效,尤其是在显示键盘的情况下.
对于问题#1,我已经找到了如何修复它,只需将CoordinatorLayout包装(在"fragment_my.xml"中)与你想要使用的任何视图(我使用FrameLayout),并且还放入一个完整大小的视图它(我只是把"视图"),因此:
<...CollapsingToolbarLayout ...
当我将CoordinatorLayout视为其视图时,它可能会混淆bottomSheet.我已经更新了项目,但是,如果有任何方法可以提供更好的解决方案,我想知道它.
最近几个月,Google已经发布了自己的bottomSheet类,但是我发现它有很多问题,所以我甚至无法尝试.
大新闻
因为有关于同一主题的4或5个问题,但有不同的要求,我试图回答所有这些,但是非礼貌的管理员删除/关闭它们,让我为每个创建一个票并将它们更改为避免"复制粘贴"我将为您提供完整答案的链接,您可以在其中找到有关如何获得Google地图等完整行为的所有说明.
回答你的问题
如何模仿谷歌地图的底层3阶段行为?
使用支持库23.x.x +,您可以修改默认值BottomSheetBehavior
,添加一个以下步骤:
创建一个Java类并从中扩展它 CoordinatorLayout.Behavior
将粘贴代码从默认BottomSheetBehavior
文件复制到新文件.
clampViewPositionVertical
使用以下代码修改方法:
@Override public int clampViewPositionVertical(View child, int top, int dy) { return constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset); } int constrain(int amount, int low, int high) { return amount < low ? low : (amount > high ? high : amount); }
添加新状态:
public static final int STATE_ANCHOR_POINT = X;
修改下一个方法:onLayoutChild
,onStopNestedScroll
,BottomSheetBehavior
和setState
(可选)
我将添加这些修改过的方法和示例项目的链接.
以下是它的外观:
[]