拖动后Edittext无法编辑

时间:2016-06-07 10:22:36

标签: android drag-and-drop android-edittext

我通过覆盖touchevent()

为我的自定义editext添加了拖拽功能

现在的问题是在将edittext拖放到特定位置之后我想通过点击它将文本输入到edittext中,它仍然被拖动可能是因为触摸事件已被覆盖而键盘似乎没有出现输入文字

解决方法可能会在长按时触发拖动功能,但现在edittext的默认longpress功能可能会发生变化

我不希望这种情况发生

怎么做。

mainactivity.java

public class MainActivity extends Activity 
{   
RelativeLayout dropLayout;


@Override
protected void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    dropLayout = (RelativeLayout) findViewById(R.id.ondraglayout);  
    dropLayout.setOnDragListener(new MyDragListener());
    EditText et = (EditText) findViewById(R.id.mainEditText1);


}   

}

my customedittext.java

public class CustomEdittext extends EditText
{
public CustomEdittext(Context context){
    super(context);

}

public CustomEdittext(Context context, AttributeSet attr){
    super(context, attr);

}

@Override
public boolean onTouchEvent(MotionEvent event)
{
    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN :

             break;
        case MotionEvent.ACTION_MOVE :
            ClipData dragdata = ClipData.newPlainText("","");

            View.DragShadowBuilder shdwbldr = new View.DragShadowBuilder(this);

            this.startDrag(dragdata, shdwbldr, this, 0);
            this.setVisibility(View.INVISIBLE);
            break;
    }
    return true;
}


}

mydraglistener.java

public class MyDragListener implements OnDragListener
{

private RelativeLayout.LayoutParams params;

@Override
public boolean onDrag(View v, DragEvent event)
{
    View view = (View) event.getLocalState();


    switch(event.getAction())
    {
        case DragEvent.ACTION_DRAG_STARTED:

            params = (RelativeLayout.LayoutParams) view.getLayoutParams();  
            break;

        case DragEvent.ACTION_DRAG_ENTERED:
            int x = (int) event.getX();
            int y = (int) event.getY();

            break;

        case DragEvent.ACTION_DRAG_EXITED :

            break;

        case DragEvent.ACTION_DRAG_LOCATION  :
            x=  (int) event.getX();
            y =  (int) event.getY();
            break;

        case DragEvent.ACTION_DRAG_ENDED   :

            break;

        case DragEvent.ACTION_DROP:

            x = (int) event.getX();
            y = (int) event.getY();
            params.leftMargin = x;
            params.topMargin = y;

            view.setLayoutParams(params);
            view.setVisibility(View.VISIBLE);



            break;
        default: break;
    }
    return true;
}


}

my main.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#CDC2C0"
android:id="@+id/ondraglayout">

<com.mycompany.myapp.CustomEdittext
    android:layout_height="wrap_content"
    android:ems="10"
    android:layout_width="wrap_content"
    android:id="@+id/mainEditText1"/>

1 个答案:

答案 0 :(得分:1)

你的整个代码完全没有意义:首先让我们讨论onTouchEvent内发生的事情:

 @Override
 public boolean onTouchEvent(MotionEvent event)
 {
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN :

         break;
      case MotionEvent.ACTION_MOVE :
        ClipData dragdata = ClipData.newPlainText("","");

        View.DragShadowBuilder shdwbldr = new View.DragShadowBuilder(this);

        this.startDrag(dragdata, shdwbldr, this, 0);
        this.setVisibility(View.INVISIBLE);
        break;
}
return true;

当您将手指放在屏幕上时,系统首先触发MotionEvent.ACTION_DOWN,之后,只要系统中没有任何其他内容消耗此事件,她就会发送MotionEvent.ACTION_MOVE的事件。这个意思就是你对startDrag()的呼唤会调用手指的每一个动作,这对你说的有意义吗?首先,我建议您将代码从MotionEvent.ACTION_MOVE移至MotionEvent.ACTION_DOWN

现在到了更重要的部分。当您将DragListener分配给View时,意思是只要View返回,此DragEvent将收到系统将提供的所有Listener true的{​​{1}}。

现在,您已将DragEvent.ACTION_DRAG_STARTED分配给DragListener。所以让我们看看你的代码:

RelativeLayout

您为case DragEvent.ACTION_DROP: x = (int) event.getX(); y = (int) event.getY(); params.leftMargin = x; params.topMargin = y; view.setLayoutParams(params); view.setVisibility(View.VISIBLE); break; 设置了新的位置,但是LayoutParams谁将获得此参数? View,而不是您的RelativeLayout。实际上,EditText现在是EditText,因为您在INVISBLE内将INVISIBLE设置为onTouchEvent并且从未更改过。 view.setVisibility(View.VISIBLE);中的代码“ACTION_DROP”不是指EditText,而是指RelativeLayout。除非您没有在此处显示其他代码,否则就是这种情况。

无论如何,在您的情况下,我建议您将startDrag()来电转移到LongCLickListener。我不知道您认为可能会改变的EditText哪些功能,至少据我所知,LongClick中没有EditText的功能。如果你想避免它,你也可以在你的代码中添加一个标志,然后在ACTION_DROP之后打开它,然后只要这个标志设置为false,就可以使ACTION_DOWN内的代码运行。