У меня есть всплывающее окно, которое отображается при нажатии на спиннер, которое загружает элементы для выбора. Пока все хорошо. Это всплывающее окно может расширяться и уменьшаться по высоте при нажатии на верхнюю часть всплывающего окна. Я сделал это, чтобы работать тоже. Моя проблема заключается в том, что когда представление расширяется или сжимается, возникает момент, когда представление не адаптируется к новым границам. Пытался сделать вид полной высоты и показать его в нижней половине экрана, но не смог этого сделать. Есть ли способ сделать настройки более плавными.
Мое всплывающее окно:
fun spinnerDropdownMenu(
spinnerTextTitle: String,
list: ArrayList<String>,
v: View,
preselected: String?
) {
val displayMetrics = this.resources.displayMetrics
val displayHeight = displayMetrics.heightPixels
val density = displayMetrics.density
val root = findViewById<ConstraintLayout>(R.id.root_view)
0.5f.applyDim(root)
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val popupView = inflater.inflate(R.layout.spinner_dropdown, root, false)
val width = LinearLayout.LayoutParams.MATCH_PARENT
val height = (displayHeight / density).toInt()
val focusable = true
val popupWindow = PopupWindow(popupView, width, height, focusable)
val textView = popupView.findViewById<TextView>(R.id.spinner_textView)
textView.text = spinnerTextTitle
val listView = popupView.findViewById<ListView>(R.id.listView_items)
val adapter = ListViewAdapter(this, list, preselected)
listView.adapter = adapter
val slideIn = Slide()
slideIn.slideEdge = Gravity.BOTTOM
popupWindow.enterTransition = slideIn
val slideOut = Slide()
slideOut.slideEdge = Gravity.BOTTOM
popupWindow.exitTransition = slideOut
popupWindow.showAtLocation(root, Gravity.BOTTOM, 0, 0)
popupWindow.setOnDismissListener { clearDim(root) }
popupView.findViewById<ImageView>(R.id.cross).setOnClickListener {
popupWindow.dismiss()
}
popupView.findViewById<ListView>(R.id.listView_items)
.setOnItemClickListener { _, _, position, _ ->
val response = listView.adapter.getItem(position).toString()
if (spinnerTextTitle == resources.getString(R.string.titlePhoneNumber)){
(v as TextInputEditText).setText(response.substringAfter("(").substringBefore(")"), TextView.BufferType.EDITABLE)
}else (v as TextInputEditText).setText(response, TextView.BufferType.EDITABLE)
popupWindow.dismiss()
}
popupView.setOnTouchListener { _, event ->
val dx = 100
val dy = 100
val rx: Int
val ry: Int
val sides: Int
val topBot: Int
when (event.action) {
MotionEvent.ACTION_MOVE -> {
rx = event.rawX.toInt()
ry = event.rawY.toInt()
sides = rx - dx
topBot = ry - dy
popupWindow.update(sides, -topBot, -1, (displayHeight - ry))
true
}
MotionEvent.ACTION_DOWN -> {
event.x.toInt()
event.y.toInt()
true
}
MotionEvent.ACTION_UP -> {
event.x.toInt()
event.y.toInt()
true
}
else -> {
true
}
}
}
}