为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 BottomSheetDialogFragment 设置最大高度?

如何在 BottomSheetDialogFragment 设置最大高度?

精慕HU 2024-01-17 21:04:36
我有一个 BottomSheetDialogFragment,我需要在此对话框中设置我的高度。我需要,当用户点击按钮时,将出现对话框并填充屏幕的 85%。这个怎么做?
查看完整描述

6 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

BottomSheetDialogFragment:


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    super.onViewCreated(view, savedInstanceState)


    val offsetFromTop = 200

    (dialog as? BottomSheetDialog)?.behavior?.apply {

        isFitToContents = false

        setExpandedOffset(offsetFromTop)

        state = BottomSheetBehavior.STATE_EXPANDED

    }

}


查看完整回答
反对 回复 2024-01-17
?
白衣非少年

TA贡献1155条经验 获得超0个赞

你可以这样做:


public class MyBottomSheetDialog extends BottomSheetDialogFragment {


   //....


   @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) {

    Dialog dialog = super.onCreateDialog(savedInstanceState);

    dialog.setOnShowListener(new DialogInterface.OnShowListener() {

      @Override public void onShow(DialogInterface dialogInterface) {

        BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface;

        setupRatio(bottomSheetDialog);

      }

    });

    return  dialog;

  }


  private void setupRatio(BottomSheetDialog bottomSheetDialog) {

    //id = com.google.android.material.R.id.design_bottom_sheet for Material Components

    //id = android.support.design.R.id.design_bottom_sheet for support librares

    FrameLayout bottomSheet = (FrameLayout) 

        bottomSheetDialog.findViewById(R.id.design_bottom_sheet);

    BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);

    ViewGroup.LayoutParams layoutParams = bottomSheet.getLayoutParams();

    layoutParams.height = getBottomSheetDialogDefaultHeight();

    bottomSheet.setLayoutParams(layoutParams);

    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);

  }

  private int getBottomSheetDialogDefaultHeight() {

    return getWindowHeight() * 85 / 100;

  }

  private int getWindowHeight() {

    // Calculate window height for fullscreen use

    DisplayMetrics displayMetrics = new DisplayMetrics();

    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

    return displayMetrics.heightPixels;

  }


}

https://img1.sycdn.imooc.com/65a7d0a400011a1b02830505.jpg

查看完整回答
反对 回复 2024-01-17
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

始终展开到完整高度可以在BottomSheetDialogFragment()的onCreateDialog中设置


    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

    val dialog = BottomSheetDialog(requireContext(), theme)

    dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED

    dialog.behavior.skipCollapsed = true

    return dialog

}

最大高度可以在onCreateView中设置


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,

        savedInstanceState: Bundle?

    ): View? {

        val view = inflater.inflate(R.layout.bottom_sheet_dialog, container, false)

        // Set max height to half screen

        view.findViewById<ConstraintLayout>

(R.id.root_layout_of_bottom_sheet).maxHeight =

            (resources.displayMetrics.heightPixels * 0.5).toInt()

        return view

    }


查看完整回答
反对 回复 2024-01-17
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

在 Kotlin 和 Jetpack 中编写:


val configuration = LocalConfiguration.current

val screenWidth = configuration.screenWidthDp.divideToPercent(0.40f) // total screen width size of 40 percentage

val screenHeight = configuration.screenHeightDp.divideToPercent(0.95f) // total screen height size of 95 percentage

configuration.screenWidth --> 给出屏幕尺寸


divideToPercent(0.40f) --> 它将给出屏幕上的一些百分比


查看完整回答
反对 回复 2024-01-17
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

非常容易处理


开始吧


override fun onStart() {

    super.onStart()

    val height = Resources.getSystem().displayMetrics.heightPixels


    // in this case I want set max height half of the device height

    val maxHeight = (height * 0.5).toInt()


    val behaviour = BottomSheetBehavior.from(requireView().parent as View)



    /* Note that If you want to display max height 

      as per your bottomsheet view 

      val maxHeight = WindowManager.LayoutParams.MATCH_PARENT */


    // now set your max peek height 

    behavior.peekHeight = maxHeight 

}

从上面的情况来看,如果你设置maxHeight = WindowManager.LayoutParams.MATCH_PARENT


当您在bottmsheet上显示一些固定的内容时,这很简单onCreateView但是有时如果更新UI后Main Thread 它可能不会显示实际高度有时那么最好使用viewTreeObserver


override fun onStart() {

    super.onStart()

    

    view?.viewTreeObserver?.addOnGlobalLayoutListener {

        val behavior = BottomSheetBehavior.from(view!!.parent as View)

        behavior.peekHeight = WindowManager.LayoutParams.MATCH_PARENT

    }



}



查看完整回答
反对 回复 2024-01-17
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

尝试这个 :


 DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

     int height = displayMetrics.heightPixels;

     int maxHeight = (int) (height*0.80);



 View bottomSheet = findViewById(R.id.bottom_sheet);  

 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);         

 behavior.setPeekHeight(maxHeight);

并在您的 XML 中:


<LinearLayout 

    android:id="@+id/bottom_sheet"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    app:behavior_hideable="true"

    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"




      .

      .

      .


</LinearLayout>


查看完整回答
反对 回复 2024-01-17
  • 6 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信