我想要一个模态的底部工作表,以填补整个屏幕减去自定义偏移。这是我的代码:
<style name="Widget.App.HuddlePostBottomSheet" parent="ThemeOverlay.MaterialComponents.BottomSheetDialog">
<item name="bottomSheetStyle">@style/Widget.App.HuddlePostBottomSheet.Modal</item>
</style>
<style name="Widget.App.HuddlePostBottomSheet.Modal" parent="Widget.MaterialComponents.BottomSheet.Modal">
<item name="backgroundTint">@color/colorSurface</item>
<item name="shapeAppearance">@style/ShapeAppearance.App.HuddlePostBottomSheet</item>
<item name="behavior_fitToContents">false</item>
<item name="behavior_skipCollapsed">false</item>
<item name="behavior_draggable">true</item>
<item name="behavior_expandedOffset">120dp</item>
<item name="shouldRemoveExpandedCorners">false</item>
</style>
我已经覆盖了片段中的onCreateDialog()方法:
class HuddlePostFragment : BottomSheetDialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL,R.style.Widget_App_HuddlePostBottomSheet)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
if (dialog is BottomSheetDialog) {
dialog.behavior.apply {
isFitToContents = false
state = BottomSheetBehavior.STATE_EXPANDED
}
}
return dialog
}
}
这是我的布局:
<layout 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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
// UI goes here
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
有了这个,我期望布局填充展开的底部表单,但我得到的是这样的:
在布局检查器中,我注意到保存底部工作表的FrameLayout
仍然是wrap_content。有办法解决吗?
我看到一些答案建议使用findViewById()
来获取FrameLayout
,但我不想这样做,因为ID将来可能会更改
1条答案
按热度按时间bqf10yzr1#
在片段生命周期
onViewCreated()
或onStart()
回调期间,您可以通过编程方式将底部工作表高度设置为MATCH_PARENT
:这不会影响
BottomSheetDialogFragment
样式中定义的偏移值。编辑
我只是有点担心com.google.android.material.R.id.design_bottom_sheet。有没有更干净的方法?我查看了github issues部分,但我找不到任何关于公开设置以更改它的讨论。
我不确定他们是不是出于某种原因这样做;如果他们这样做了,那将极大地改变许多开发人员的生活:)。无论如何,您将使用传入
onViewCreated
的view
参数: