Android: 拖放后,被拖拽的编辑文字消失
Android: After drop, editText that was being dragged disapears
我正在尝试创建一个用户可以在其中移动输入的表单。我有一个 editText 并希望它能够将它移动到我的 relativeLayout 中的新位置。我可以把它捡起来并四处移动,但一旦我放手,它就会完全消失。我几乎什么都试过了。我认为 onDrag 方法可能永远不会被调用,因为我的日志永远不会出现。此外,在放开我的 editText 后,我在 logcat 中收到此错误消息:Reporting drop result: 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>
这是我的 class:
import android.content.ClipData;
import android.content.ClipDescription;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;
import common.FileManagement;
public class NewForm extends AppCompatActivity
{
private static EditText editText;
private android.widget.RelativeLayout.LayoutParams layoutParams;
String msg;
@Override
protected void onCreate ( Bundle savedInstanceState )
{
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_new_form );
Toolbar toolbar = ( Toolbar ) findViewById ( R.id.toolbar );
setSupportActionBar ( toolbar );
editText = ( EditText ) findViewById ( R.id.editText );
FileManagement fileManagement = new FileManagement ();
editText.setText ( fileManagement.read ( "textViewData", getApplicationContext () ) );
FloatingActionButton fab = ( FloatingActionButton ) findViewById ( R.id.fab );
fab.setOnClickListener ( new View.OnClickListener ()
{
@Override
public void onClick ( View view )
{
FileManagement fileManagement = new FileManagement ();
String tmpEditText = editText.getText ().toString ();
MainActivity.textView.setText ( tmpEditText );
fileManagement.save ( "textViewData", tmpEditText, getApplicationContext () );
finish ();
}
} );
editText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item);
View.DragShadowBuilder myShadow = new View.DragShadowBuilder(editText);
v.startDrag(dragData,myShadow,null,0);
return true;
}
});
editText.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");
return true;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_EXITED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
layoutParams.leftMargin = x_cord;
layoutParams.topMargin = y_cord;
v.setLayoutParams(layoutParams);
return true;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_ENDED :
Log.d ( msg, "Action is DragEvent.ACTION_DRAG_ENDED" );
return true;
case DragEvent.ACTION_DROP:
Log.d( msg, "ACTION_DROP event");
return true;
default:
break;
}
return true;
}
});
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;
}
}
});
}
}
我也尝试过使用 break;
而不是 return true;
的 onDrag 方法
我试过这样:
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()
private EditText editText;
private RelativeLayout.LayoutParams layoutParams;
其余:
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;
}
} );
I get this error message in logcat: Reporting drop result: false
这不是错误信息。这意味着 View
DragListener
.
未返回 true
的操作下降
您的 EditText
消失了,因为您在 onTouchListener
中将其设置为 View.INVISIBLE
不可见,并且从未更改回来。
试试这个:
首先选择是否要通过触摸或长按拖动。你不需要两者。假设您决定通过触摸来完成:
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;
}
}
});
从代码监听器中删除所有冗余代码,因为系统会为您处理拖动,因此不需要将其添加到拖动中。如果您希望 Drop 的坐标成为 EditText
的新位置,那么您需要将 DragListener
分配给 EditText
容器 RelativeLayout
并在 `ACTION_DROP。如果不是:
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 并希望它能够将它移动到我的 relativeLayout 中的新位置。我可以把它捡起来并四处移动,但一旦我放手,它就会完全消失。我几乎什么都试过了。我认为 onDrag 方法可能永远不会被调用,因为我的日志永远不会出现。此外,在放开我的 editText 后,我在 logcat 中收到此错误消息:Reporting drop result: 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>
这是我的 class:
import android.content.ClipData;
import android.content.ClipDescription;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.RelativeLayout;
import common.FileManagement;
public class NewForm extends AppCompatActivity
{
private static EditText editText;
private android.widget.RelativeLayout.LayoutParams layoutParams;
String msg;
@Override
protected void onCreate ( Bundle savedInstanceState )
{
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_new_form );
Toolbar toolbar = ( Toolbar ) findViewById ( R.id.toolbar );
setSupportActionBar ( toolbar );
editText = ( EditText ) findViewById ( R.id.editText );
FileManagement fileManagement = new FileManagement ();
editText.setText ( fileManagement.read ( "textViewData", getApplicationContext () ) );
FloatingActionButton fab = ( FloatingActionButton ) findViewById ( R.id.fab );
fab.setOnClickListener ( new View.OnClickListener ()
{
@Override
public void onClick ( View view )
{
FileManagement fileManagement = new FileManagement ();
String tmpEditText = editText.getText ().toString ();
MainActivity.textView.setText ( tmpEditText );
fileManagement.save ( "textViewData", tmpEditText, getApplicationContext () );
finish ();
}
} );
editText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item);
View.DragShadowBuilder myShadow = new View.DragShadowBuilder(editText);
v.startDrag(dragData,myShadow,null,0);
return true;
}
});
editText.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();
Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");
return true;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
int x_cord = (int) event.getX();
int y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_EXITED :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
layoutParams.leftMargin = x_cord;
layoutParams.topMargin = y_cord;
v.setLayoutParams(layoutParams);
return true;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
x_cord = (int) event.getX();
y_cord = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_ENDED :
Log.d ( msg, "Action is DragEvent.ACTION_DRAG_ENDED" );
return true;
case DragEvent.ACTION_DROP:
Log.d( msg, "ACTION_DROP event");
return true;
default:
break;
}
return true;
}
});
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;
}
}
});
}
}
我也尝试过使用 break;
而不是 return true;
的 onDrag 方法
我试过这样:
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()
private EditText editText;
private RelativeLayout.LayoutParams layoutParams;
其余:
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;
}
} );
I get this error message in logcat: Reporting drop result: false
这不是错误信息。这意味着 View
DragListener
.
true
的操作下降
您的 EditText
消失了,因为您在 onTouchListener
中将其设置为 View.INVISIBLE
不可见,并且从未更改回来。
试试这个: 首先选择是否要通过触摸或长按拖动。你不需要两者。假设您决定通过触摸来完成:
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;
}
}
});
从代码监听器中删除所有冗余代码,因为系统会为您处理拖动,因此不需要将其添加到拖动中。如果您希望 Drop 的坐标成为 EditText
的新位置,那么您需要将 DragListener
分配给 EditText
容器 RelativeLayout
并在 `ACTION_DROP。如果不是:
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;
}
});