我有一个 BottomSheetDialogFragment,我需要在此对话框中设置我的高度。我需要,当用户点击按钮时,会出现对话框并填满 85% 的屏幕。这个怎么做?
7 回答
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
}
}
您可以执行以下操作:
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;
}
}
始终展开到全高可以在您的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
}
这很容易处理
开始吧
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
当您在底部表上显示一些固定时,这很简单onCreateView
但是有时如果更新UI
后Main Thread
可能不会显示actula高度有时则更好用viewTreeObserver
override fun onStart() {
super.onStart()
view?.viewTreeObserver?.addOnGlobalLayoutListener {
val behavior = BottomSheetBehavior.from(view!!.parent as View)
behavior.peekHeight = WindowManager.LayoutParams.MATCH_PARENT
}
}
尝试这个 :
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>
只需添加mohammadReza Abiri和Gabriele Mariotti 的答案:
如果您的 BottomSheetBehavior 为空,请将其包裹在 CoordinatorLayout 周围。
BottomSheetBehavior 应用于 CoordinatorLayout 的子级,以使该子级成为持久的底部工作表。
持久底部表是从屏幕底部出现的视图,位于主要内容之上。可以垂直拖动它们以显示更多或更少的内容。
注意:如果要使用模态的底部工作表(对话框),请使用 BottomSheetDialogFragment。
BottomSheetBehavior 与 CoordinatorLayout 协同工作,让您在底部工作表(主要内容之上的一层)上显示内容、执行进入/退出动画、响应拖动/滑动手势等。
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- This is your BottomSheetBehavior Layout -->
<include layout="@layout/bottom_sheet" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
要以编程方式控制底部工作表,您可以调用 BottomSheetBehavior 上的setState方法。一种常见的模式是设置窥视高度并将状态设置为折叠以使其对用户可见:
bottomSheetBehavior.setPeekHeight(300);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
当您的项目高度太短并且没有填满您的底页并且其他方式无法解决它时,请尝试以下代码:
底页片段:
override fun onStart() {
super.onStart()
view?.viewTreeObserver?.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
val behavior = BottomSheetBehavior.from(view!!.parent as View)
behavior.peekHeight = **your height**
}
})
}