Android BottomSheetDialogFragment不会完全展开

我有以下测试底页实现。

当我将peekHeight设置为小于500的值时,它可以工作。 经过一定的价值后,任何增加的峰值高度都不会改变底部纸张的展开方式。 它只是留在那里只手动拖动。 我们如何以编程方式设置peekHeight以确保底部工作表自动扩展到查看高度。

在此处输入图像描述

bottom_sheet_dialog_main

               

Java代码

 public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment { private static BottomSheetBehavior bottomSheetBehavior; private static View bottomSheetInternal; private static MyBottomSheetDialogFragment INSTANCE; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { getDialog().setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { BottomSheetDialog d = (BottomSheetDialog) dialog; CoordinatorLayout coordinatorLayout = (CoordinatorLayout)d.findViewById(R.id.locUXCoordinatorLayout); bottomSheetInternal = d.findViewById(R.id.locUXView); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetInternal); bottomSheetBehavior.setPeekHeight(bottomSheetInternal.getHeight()); bottomSheetInternal.requestLayout(); coordinatorLayout.getLayoutParams().height = bottomSheetInternal.getHeight(); Toast.makeText(getActivity(), "Height is" + bottomSheetInternal.getHeight() + " " + coordinatorLayout.getLayoutParams().height, Toast.LENGTH_LONG).show(); } }); INSTANCE = this; return inflater.inflate(R.layout.bottom_sheet_dialog_main, container, false); } } 

我find了另一个解决方案。 也许对于未来的读者来说它可能很有用。

 @Override public void setupDialog(Dialog dialog, int style) { super.setupDialog(dialog, style); final View root = View.inflate(getContext(), R.layout.fragment_bottom_sheet_choose_time, null); dialog.setContentView(root); initView(root); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) root.getParent()).getLayoutParams(); CoordinatorLayout.Behavior behavior = params.getBehavior(); if (behavior != null && behavior instanceof BottomSheetBehavior) { mBottomSheetBehavior = (BottomSheetBehavior) behavior; mBottomSheetBehavior.setBottomSheetCallback(mBottomSheetBehaviorCallback); root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { root.getViewTreeObserver().removeGlobalOnLayoutListener(this); int height = root.getMeasuredHeight(); mBottomSheetBehavior.setPeekHeight(height); } }); } } 

正如@Anthonyeef所提到的,这里的ViewTreeObserver旨在获得真正测量视图后的精确测量高度,并删除GlobalOnLayoutListener以获得更好的性能。

但是,在生产中使用之前,请在不同的设备和屏幕上测试此解决方案,因为如果底页中的内容高于屏幕,则会产生一些奇怪的滑动行为。

在onCreateView中使用此代码。

 getDialog().setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { BottomSheetDialog d = (BottomSheetDialog) dialog; FrameLayout bottomSheet = (FrameLayout) d.findViewById(R.id.design_bottom_sheet); CoordinatorLayout coordinatorLayout = (CoordinatorLayout) bottomSheet.getParent(); BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setPeekHeight(bottomSheet.getHeight()); coordinatorLayout.getParent().requestLayout(); } }); 

通过更深入的UI检查,我们发现有另一个CoordinatorLayout包装我们的协调器布局。 父CoordinatorLayout有一个带有BottomSheetBehaviorFrameLayout ,其id为design_bottom_sheet 。 由于FrameLayoutmatch_parent高度与id design_bottom_sheet ,我们上面的代码设置的peek高度受到限制

通过使用id design_bottom_sheet设置FrameLayout的峰值高度,此问题已得到解决

  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { getDialog().setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { BottomSheetDialog d = (BottomSheetDialog) dialog; coordinatorLayout = (CoordinatorLayout) d.findViewById(R.id.locUXCoordinatorLayout); bottomSheetInternal = d.findViewById(R.id.locUXView); bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetInternal); bottomSheetBehavior.setHidable(false); BottomSheetBehavior.from((View)coordinatorLayout.getParent()).setPeekHeight(bottomSheetInternal.getHeight()); bottomSheetBehavior.setPeekHeight(bottomSheetInternal.getHeight()); coordinatorLayout.getParent().requestLayout(); } });