- BottomSheetDialogFragment
- NestedScrollView
- EditText

По мере ввода пользователем высота BottomSheetDialogFragment увеличивается. Если пользователь продолжает вводить текст, высота BottomSheetDialogFragment увеличится до тех пор, пока не заполнит весь экран.

Однако вместо того, чтобы разворачиваться на весь экран, нам нужен BottomSheetDialogFragment для увеличения высоты только до определенной точки, после чего он должен остановиться, чтобы не допустить закрытия всего экрана. Это желаемое поведение показано на следующем снимке экрана. После этого момента, если пользователь продолжает печатать, NestedScrollView должен стать прокручиваемым.
[img]https://i .stack.imgur.com/CC4MP.png[/img]
Есть ли у вас идеи, как этого можно добиться? >
Ниже представлена текущая реализация исходного кода.
todo_input_dialog_fragment.xml
TodoInputDialogFragment.kt
class TodoInputDialogFragment : BottomSheetDialogFragment() {
private var _binding: TodoInputDialogFragmentBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
private var keyboardVisible = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = TodoInputDialogFragmentBinding.inflate(inflater, container, false)
val root: View = binding.root
// https://stackoverflow.com/questions/649 ... t-windowin
ViewCompat.setOnApplyWindowInsetsListener(root) { _, insets ->
// https://stackoverflow.com/a/63595830/72437
val currKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
if (!currKeyboardVisible && (this.keyboardVisible != currKeyboardVisible)) {
dismiss()
}
this.keyboardVisible = currKeyboardVisible
insets
}
binding.submitButton.setOnClickListener {
submit()
}
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
focusAndShowKeyboard(requireActivity(), binding.editText)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
// https://stackoverflow.com/questions/649 ... t-windowin
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
dialog.window?.also {
it.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
}
}
// https://stackoverflow.com/questions/468 ... t-dragging
//dialog.setOnShowListener { dialogInterface ->
// val bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet)
//
// if (bottomSheet != null) {
// val behavior: BottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
// behavior.isDraggable = false
// }
//}
return dialog
}
override fun getTheme(): Int {
return com.yocto.wetodo.R.style.TodoInputDialogFragmentStyle
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun submit() {
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... ogfragment
Мобильная версия