Android:拖放后,被拖动的editText消失

Android:拖放后,被拖动的editText消失,android,android-studio,drag-and-drop,android-emulator,android-relativelayout,Android,Android Studio,Drag And Drop,Android Emulator,Android Relativelayout,我试图创建一个表单,用户可以在其中移动输入。我有一个editText,希望它能够将它移动到我的relativeLayout中的一个新位置。我可以把它捡起来并移动,但一旦我放开,它就会完全消失。我几乎什么都试过了。我认为onDrag方法可能永远不会被调用,因为我的日志永远不会显示。另外,在放开editText之后,我在logcat中得到了这个错误消息:报告丢弃结果:false 我遇到的另一个问题是,当你点击editText时,它认为我试图拖动它,这意味着我实际上无法更改其中的文本 感谢您的帮助!谢

我试图创建一个表单,用户可以在其中移动输入。我有一个editText,希望它能够将它移动到我的relativeLayout中的一个新位置。我可以把它捡起来并移动,但一旦我放开,它就会完全消失。我几乎什么都试过了。我认为onDrag方法可能永远不会被调用,因为我的日志永远不会显示。另外,在放开editText之后,我在logcat中得到了这个错误消息:
报告丢弃结果:false

我遇到的另一个问题是,当你点击editText时,它认为我试图拖动它,这意味着我实际上无法更改其中的文本

感谢您的帮助!谢谢

以下是我的相对布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
                xmlns:app = "http://schemas.android.com/apk/res-auto"
                xmlns:tools = "http://schemas.android.com/tools"
                android:layout_width = "match_parent"
                android:layout_height = "match_parent"
                android:paddingBottom = "@dimen/activity_vertical_margin"
                android:paddingLeft = "@dimen/activity_horizontal_margin"
                android:paddingRight = "@dimen/activity_horizontal_margin"
                android:paddingTop = "@dimen/activity_vertical_margin"
                app:layout_behavior = "@string/appbar_scrolling_view_behavior"
                tools:context = "com.supercilex.myapp.NewForm"
                tools:showIn = "@layout/activity_new_form"
    android:id="@+id/relativeLayout">

    <EditText
        android:id = "@+id/editText"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignParentStart = "true"
        android:layout_alignParentTop = "true"
        android:ems = "10"
        android:hint = "Enter some text"
        android:inputType = "textPersonName" />
</RelativeLayout>
我还用
break尝试了我的onDrag方法
而不是
返回true
我试过这样做:

public boolean onDrag(View v, DragEvent event) {
                switch(event.getAction())
                {
                    case DragEvent.ACTION_DRAG_STARTED:
                        break;

                    case DragEvent.ACTION_DRAG_ENTERED:
                        break;

                    case DragEvent.ACTION_DRAG_EXITED :
                        break;

                    case DragEvent.ACTION_DRAG_LOCATION  :
                        break;

                    case DragEvent.ACTION_DRAG_ENDED   :
                        break;

                    case DragEvent.ACTION_DROP:
                        View view = (View) event.getLocalState();
                        ViewGroup owner = (ViewGroup) view.getParent();
                        owner.removeView(view);
                        FrameLayout container = (FrameLayout) v;
                        container.addView(view);
                        view.setVisibility(View.VISIBLE);
                        Log.d( msg, "ACTION_DROP event");
                        break;
                    default:
                        break;
                }
                return true;
            }
编辑: 这是我的更新代码:

以上
onCreate()

其余的:

findViewById(R.id.yourlayoutname).setOnDragListener( new View.OnDragListener()
            {
                @Override
                public boolean onDrag ( View v, DragEvent event )
                {
                    if ( event.getAction() == DragEvent.ACTION_DROP )
                    {
                        int xCord = ( int ) event.getX();
                        int yCord = ( int ) event.getY();
                        int height = editText.getHeight();
                        int width = editText.getWidth();
                        layoutParams.leftMargin = xCord - width;
                        layoutParams.topMargin = yCord - height;
                        editText.setLayoutParams( layoutParams );
                    }
                    return true;
                }
            });

            editText.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN};

                    ClipData data = ClipData.newPlainText("", "");
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(editText);

                    v.startDrag( data, shadowBuilder, mimeTypes, 0);
                    return true;
                }
            } );

            editText.setOnDragListener( new View.OnDragListener()
            {
                @Override
                public boolean onDrag ( View v, DragEvent event )
                {
                    if ( event.getAction() == DragEvent.ACTION_DRAG_STARTED )
                    {
                        layoutParams = ( RelativeLayout.LayoutParams ) v.getLayoutParams();
                    }
                    return true;
                }
            } );

我在logcat中得到这个错误消息:报告丢弃结果:false
这不是错误信息。这意味着
视图
DragListener
的结果是操作drop没有返回
true

您的
EditText
会消失,因为您将其设置为
View.INVISIBLE
在您的
onTouchListener
中,并且从未将其更改回来

试试这个: 首先选择是否要通过触摸或长时间单击进行拖动。你不需要两者兼而有之。比如说,你决定通过触摸来实现:

editText.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(editText);

                editText.startDrag(data, shadowBuilder, editText, 0);
                editText.setVisibility(View.INVISIBLE);
                return true;
            }
            else
            {
                return false;
            }
        }
    });
从代码侦听器中删除所有reduntant代码,无需在系统为您处理拖动时将其拖动。如果希望放置的坐标成为
EditText
的新位置,则需要将
DragListener
分配给
EditText
容器
RelativeLayout
并在“操作”放置中检索它们。如果没有:

 editText.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View v, DragEvent event) {
            if (event.getAction == DragEvent.ACTION_DRAG_STARTED){
                    layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
            } else if (event.getAction() ==   DragEvent.ACTION_DRAG_ENDED)
                v.setVisibility(View.VISIBLE)

            return true;
        }
    });
要获得放置位置,您需要以下内容:

findViewById(R.id.relativeLayout).setOnDragListener(new View.OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        if (event.getAction() ==   DragEvent.ACTION_DRAG_DROP){
             int x_cord = (int) event.getX();
             int  y_cord = (int) event.getY();
             layoutParams.leftMargin = x_cord;
             layoutParams.topMargin = y_cord;
             editText.setLayoutParams(layoutParams);

        }
        return true;
    }
});

如果希望放置的坐标成为EditText的新位置,则需要将DragListener分配给EditText容器RelativeLayout并在操作中检索它们。如果你能教我怎么做我会很高兴的。
 editText.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View v, DragEvent event) {
            if (event.getAction == DragEvent.ACTION_DRAG_STARTED){
                    layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
            } else if (event.getAction() ==   DragEvent.ACTION_DRAG_ENDED)
                v.setVisibility(View.VISIBLE)

            return true;
        }
    });
findViewById(R.id.relativeLayout).setOnDragListener(new View.OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        if (event.getAction() ==   DragEvent.ACTION_DRAG_DROP){
             int x_cord = (int) event.getX();
             int  y_cord = (int) event.getY();
             layoutParams.leftMargin = x_cord;
             layoutParams.topMargin = y_cord;
             editText.setLayoutParams(layoutParams);

        }
        return true;
    }
});