android 模态底部表未变为全屏

8cdiaqws  于 2023-05-21  发布在  Android
关注(0)|答案(1)|浏览(108)

我想要一个模态的底部工作表,以填补整个屏幕减去自定义偏移。这是我的代码:

<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将来可能会更改

bqf10yzr

bqf10yzr1#

在片段生命周期onViewCreated()onStart()回调期间,您可以通过编程方式将底部工作表高度设置为MATCH_PARENT

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    val parentLayout =
        (dialog as BottomSheetDialog)
            .findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)

    parentLayout?.let { bottomSheet ->
    
        // set the bottom sheet height to match_parent
        val layoutParams = bottomSheet.layoutParams
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT
        bottomSheet.layoutParams = layoutParams

    }
}

这不会影响BottomSheetDialogFragment样式中定义的偏移值。

编辑

我只是有点担心com.google.android.material.R.id.design_bottom_sheet。有没有更干净的方法?我查看了github issues部分,但我找不到任何关于公开设置以更改它的讨论。
我不确定他们是不是出于某种原因这样做;如果他们这样做了,那将极大地改变许多开发人员的生活:)。无论如何,您将使用传入onViewCreatedview参数:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
     (view.parent as View).layoutParams.apply {
          height = WindowManager.LayoutParams.MATCH_PARENT
     }
}

相关问题