BottomSheetDialogFragment не заполняет желаемую высоту и всегда переносит содержимое

Я реализую BottomSheetDialogFragment, который я хотел бы сначала заполнить половину экрана с возможностью перетащить его на весь экран или перетащить вниз, чтобы закрыть. Чтобы упростить реализацию и найти источник моей проблемы, я создал простой файл макета с красным фоном и текстовым представлением. Проблема, с которой я сталкиваюсь, заключается в том, что даже когда я устанавливаю для параметра Behavior.state значение STATE_HALF_EXPANDED, верхняя часть диалогового окна нижнего листа находится на полпути моего экрана, но фон переносится, чтобы соответствовать моему текстовому представлению, а не расширяется, чтобы заполнить все ниже. это. Я все еще могу перетащить его на весь экран, но опять же, фон переносится на мое текстовое представление, а не заполняет доступное пространство ниже. Аналогично, если я удалю textView, ничего не будет показано, кроме черного непрозрачного фона, который находится за BottomSheetDialogFragment.

Вот мой файл макета, который я использую для своего BottomSheetDialogFragment (text.xml):

<?xml version = "1.0" encoding = "utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "#ff0000">

    <TextView
        android:id = "@+id/textView20"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "TextView"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintHorizontal_bias = "0.5"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintVertical_bias = "0.5" />

</androidx.constraintlayout.widget.ConstraintLayout>

Вот моя реализация BottomSheetDialogFragment:

class TestBottomSheet: BottomSheetDialogFragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.test, container, false)
    }

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

        val behavior = BottomSheetBehavior.from(requireView().parent as View)
        behavior.peekHeight = resources.displayMetrics.heightPixels / 2
        behavior.isHideable = true
        behavior.isDraggable = true
        behavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
    }
}

И вот моя функция в моей деятельности, которая показывает BottomSheetDialogFragment.

private val onButtonClick = View.OnClickListener {
    val bottomSheetFragment = TestBottomSheet()

    bottomSheetFragment.show(supportFragmentManager, "BottomSheetDialog")
}

Вот скриншоты того, что я вижу:
Когда «behavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED»

Когда «behavior.state = BottomSheetBehavior.STATE_EXPANDED»

Я также попытался обернуть свой test.xml в координаторLayout с тем же результатом.

Я хотел бы, чтобы красный фон заполнял половину экрана с текстовым представлением по центру, поскольку конечный результат этого BottomSheetDialogFragment будет иметь переменное содержимое, которое может занимать больше или меньше половины размера экрана, но BottomSheetDialogFragment всегда должен занимать половину экрана с возможностью при желании перетащить его на весь экран.

0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проверьте, заменив приведенный ниже метод указанным фрагментом кода. Прикрепил снимок того, как это будет выглядеть.

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view.post {
        val parent = view.parent as View
        val params = parent.layoutParams
        val behavior = (params as ViewGroup.LayoutParams).apply {
            height = (resources.displayMetrics.heightPixels * 0.5).toInt()
        }
        parent.layoutParams = behavior
    }
}

![снимок][2]

Другие вопросы по теме