【发布时间】:2021-08-29 18:03:39
【问题描述】:
我遇到了弹出窗口和拖放问题。我想在将视图拖动到另一个视图时关闭弹出窗口并显示一个新窗口。我可以创建一个新的弹出窗口,但不能关闭旧的。我怎么解决这个问题?这总是会创建一个新的。
调用组件dismiss方法可以但不能dismiss。
`
class SubstitutionPopUpComponent @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
) : PopupWindow(context, attrs, defStyleAttr) {
val binding: ComponentPlayerSubstitutionPopupBinding = DataBindingUtil.inflate(
LayoutInflater.from(context),
R.layout.component_player_substitution_popup,
null,
false
)
fun createPopup(
view: View,
playerInName: String,
playerOutName: String,
): PopupWindow {
binding.apply {
this.playerInName = playerInName
this.playerOutName = playerOutName
}
val x = view.getScreenLocation()[0]
val y = view.getScreenLocation()[1]
return PopupWindow(
binding.root,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
isOutsideTouchable = true
isFocusable = true
elevation = 10f
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
showAtLocation(view, Gravity.NO_GRAVITY, x + view.width, y)
}
}
fun dismissPopup() {
dismiss()
}
}`
internal class MyDragListener(ctx: Context, popUpComponent: SubstitutionPopUpComponent?) :
OnDragListener {
val context = ctx
val substitutionPopUpComponent = popUpComponent
override fun onDrag(target: View, event: DragEvent): Boolean {
when (event.action) {
DragEvent.ACTION_DROP -> {
if (substitutionPopUpComponent.isNotNull()) {
substitutionPopUpComponent?.dismissPopup()
}
val dragged = event.localState as View
val oldPlayer = dragged.parent as ViewGroup
val newPlayer = target.parent as ViewGroup
when {
(oldPlayer as SquadPlayerComponent).binding.player != null -> {
when ((newPlayer as SquadPlayerComponent).playerPosition) {
oldPlayer.playerPosition -> {
if (oldPlayer.binding.player != null && newPlayer.binding.player != null) {
Utils.swapPlayers(
oldPlayer.binding.player!!,
newPlayer.binding.player!!,
oldPlayer.isSubPlayer,
newPlayer.isSubPlayer,
newPlayer.playerPosition.toString()
)
}
}
}
}
}
}
DragEvent.ACTION_DRAG_ENTERED -> {
val dragged = event.localState as View
val oldPlayer = dragged.parent as ViewGroup
val newPlayer = target.parent as ViewGroup
substitutionPopUpComponent?.apply {
createPopup(oldPlayer,
(newPlayer as SquadPlayerComponent).binding.player?.name.toString(),
(oldPlayer as SquadPlayerComponent).binding.player?.name.toString()
)
}
}
DragEvent.ACTION_DRAG_EXITED -> {
if (substitutionPopUpComponent.isNotNull()) {
substitutionPopUpComponent?.dismissPopup()
}
}
}
return true
}
}
【问题讨论】:
-
你解决问题了吗?
-
是的@ArtemViter 我已将draglistener 更改为此并解决了问题。内部类 MyDragListener(private var substitutionPopUp: PopupWindow?) : OnDragListener {
标签: android drag-and-drop popupwindow dismiss