Я реализую 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 всегда должен занимать половину экрана с возможностью при желании перетащить его на весь экран.
Проверьте, заменив приведенный ниже метод указанным фрагментом кода. Прикрепил снимок того, как это будет выглядеть.
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
}
}