错误:指定的子代已经有一个父代拖放时必须先在孩子的父母上调用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...