如何解决错误:指定的子代已经有一个父代拖放时必须先在孩子的父母上调用removeView
我正在尝试实现拖放。为此,我有一个空的LinearLayout,我想通过拖放将textview添加到其中。布局如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:id="@+id/ll_pinklayout"
android:orientation="vertical"
android:layout_height="350dp"
android:background="#FF8989">
<LinearLayout
android:layout_width="150dp"
android:id="@+id/ll_greylayout"
android:orientation="vertical"
android:layout_gravity="center"
android:layout_height="150dp"
android:background="#ffffff"></LinearLayout>
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_dropdrop"
android:text="Drag Text"
android:textSize="24sp"
android:layout_margin="16dp"
android:textColor="#000000"/>
</LinearLayout>
</RelativeLayout>
科特琳课:
class MainActivity : AppCompatActivity(),View.OnTouchListener,View.OnDragListener {
private val TAG = MainActivity::class.java.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setListeners()
}
private fun setListeners() {
tv_dropdrop.setOnTouchListener(this)
ll_greylayout.setOnDragListener(this)
}
override fun onDrag(view:View,dragEvent: DragEvent):Boolean {
Log.d(TAG,"onDrag: view->$view\n DragEvent$dragEvent")
when (dragEvent.action) {
DragEvent.ACTION_DRAG_ENDED -> {
Log.d(TAG,"onDrag: ACTION_DRAG_ENDED ")
return true
}
DragEvent.ACTION_DRAG_EXITED -> {
Log.d(TAG,"onDrag: ACTION_DRAG_EXITED")
return true
}
DragEvent.ACTION_DRAG_ENTERED -> {
Log.d(TAG,"onDrag: ACTION_DRAG_ENTERED")
return true
}
DragEvent.ACTION_DRAG_STARTED -> {
Log.d(TAG,"onDrag: ACTION_DRAG_STARTED")
return true
}
DragEvent.ACTION_DROP -> {
Log.d(TAG,"onDrag: ACTION_DROP")
val tvState = dragEvent.localState as View
Log.d(TAG,"onDrag:viewX" + dragEvent.x + "viewY" + dragEvent.y)
Log.d(TAG,"onDrag: Owner->" + tvState.parent)
val tvParent = tvState.parent as ViewGroup
tvParent.removeView(tvState)
val container = view as LinearLayout
container.addView(tvState)
tvParent.removeView(tvState)
tvState.x = dragEvent.x
tvState.y = dragEvent.y
view.addView(tvState)
view.setVisibility(View.VISIBLE)
return true
}
DragEvent.ACTION_DRAG_LOCATION -> {
Log.d(TAG,"onDrag: ACTION_DRAG_LOCATION")
return true
}
else -> return false
}
}
override fun onTouch(view:View,motionEvent: MotionEvent):Boolean {
Log.d(TAG,"onTouch: view->view$view\n MotionEvent$motionEvent")
return if (motionEvent.action === MotionEvent.ACTION_DOWN) {
val dragShadowBuilder = View.DragShadowBuilder(view)
view.startDrag(null,dragShadowBuilder,view,0)
true
} else {
false
}
}
}
对于这一行“ view.addView(tvState)”,它给出了此异常:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:5150)
.....
但是在这里我没有做错什么,所以请提出解决方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。