dynamic改变BottomSheetBehavior的高度

我使用Google最近发布的AppCompat v23.2的BottomSheetBehavior 。 底部表单的高度取决于底部表单内部显示的内容(类似于Google在其地图应用中自己的内容)。

它在最初加载数据时工作正常,但是我的应用程序更改了运行时显示的内容,发生这种情况时,底部表单会保留在旧的高度,这会导致底部未使用的空间或视图切割。

有没有办法通知底部工作表布局重新计算用于展开状态的高度(当ViewGroup高度设置为MATCH_HEIGHT )或以任何方式手动设置所需的高度?


编辑:我也试图手动调用ViewGroup和它的父母invalidate() ,但没有任何成功。

Solutions Collecting From Web of "dynamic改变BottomSheetBehavior的高度"

RelativeLayout与我的底部表单有相同的问题。 高度将不会被重新计算。 我不得不求助于通过新的重新计算的值设置高度,并调用BottomSheetBehavior.onLayoutChild

这是我的临时解决scheme:

 coordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinator_layout); bottomSheet = findViewById(R.id.bottom_sheet); int accountHeight = accountTextView.getHeight(); accountTextView.setVisibility(View.GONE); bottomSheet.getLayoutParams().height = bottomSheet.getHeight() - accountHeight; bottomSheet.requestLayout(); behavior.onLayoutChild(coordinatorLayout, bottomSheet, ViewCompat.LAYOUT_DIRECTION_LTR); 

你可以使用BottomSheetBehavior#setPeekHeight

 FrameLayout bottomSheet = (FrameLayout) findViewById(R.id.bottom_sheet); BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet); behavior.setPeekHeight(newHeight); 

这不会自动将底部页面移动到偷看高度。 您可以调用BottomSheetBehavior#setState将底部表单调整到新的顶部高度。

 behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 

当我在BottomSheet中使用recyclerview并且项目dynamic更改时,我遇到了同样的问题。 正如@sosite在他的评论中提到的那样,这个问题被logging下来,他们已经在最新的版本中修复了这个问题。 在这里发布日志

只需将您的devise支持库更新到版本24.0.0并检查。

虽然问题已经在> = 24.0.0支持库中得到解决,但如果由于某种原因您仍然需要使用旧版本,那么这是一个解决方法。

 mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull final View bottomSheet, int newState) { bottomSheet.post(new Runnable() { @Override public void run() { //workaround for the bottomsheet bug bottomSheet.requestLayout(); bottomSheet.invalidate(); } }); } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { } }); 

我面临同样的问题,当试图根据其内容更新偷看高度时,发现以前版面的高度。 这是有道理的,因为新的布局还没有发生。 通过在UI线程上发布布局高度在新的布局之后被计算,并且另一个布局请求被做出来将底部表单更新到正确的高度。

 void show() { setVisibility(View.VISIBLE); post(new Runnable() { @Override public void run() { mBottomSheetBehavior.setPeekHeight(findViewById(R.id.sheetPeek).getHeight()); requestLayout(); } }) }