2015-08-15 98 views
0

我有2个EditText,我希望能够拖放到我的屏幕上。我现在遇到的问题是,它们拖动得很好 - 但是当拖动被释放时,而不是被放弃,EditText消失。无法拖放元素(在释放拖动时消失)

我设置的听众喜欢这样的:

//etUsername and etPartnerName are the EditText's I want to make draggable 
etUsername.setOnTouchListener(new MyTouchListener()); 
etUsername.setOnDragListener(new MyDragListener()); 
etPartnerName.setOnTouchListener(new MyTouchListener());  
etPartnerName.setOnDragListener(new MyDragListener()); 

在同一个片段,我有听众的类:

private final class MyTouchListener implements View.OnTouchListener { 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 

      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

class MyDragListener implements View.OnDragListener { 
    View draggedView; 
    EditText dropped; 
    private android.widget.LinearLayout.LayoutParams layoutParams; 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     int action = event.getAction(); 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams(); 

       // Do nothing 
       break; 

      case DragEvent.ACTION_DRAG_ENTERED: 
       int x_cord = (int) event.getX(); 
       int y_cord = (int) event.getY(); 
       break; 

      case 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); 
       break; 

      case DragEvent.ACTION_DRAG_LOCATION: 
       x_cord = (int) event.getX(); 
       y_cord = (int) event.getY(); 
       break; 

      case DragEvent.ACTION_DRAG_ENDED: 
       // Do nothing 
       break; 

      case DragEvent.ACTION_DROP: 

       // Do nothing 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 
} 

灿”在网上找到一个可行的解决方案,并尝试了几个教程,并得出了相同的结果。任何人都可以看到错误在哪里?

非常感谢任何帮助,谢谢。

回答

0

你犯了同样的错误,因为许多开发人员误解了android Drag And Drop概念的概念。

当您设置On View.OnDragListener侦听器,这意味着注册到侦听器的视图将获得Drag事件的事件。所以基本上,如果您注册的唯一事件是EditTexts本身,则在大部分时间内,您在ACTION_DRAG_ENTERED,ACTION_DRAG_LOCATION,ACTION_DRAG_EXITED,ACTION_DRAG_DROPPED中放置的所有逻辑都是无用的。

我想你认为你在事件中放置的逻辑是什么让View遵循你的手指。那么如果你认为这真的是错误的,因为框架本身管理视图,你在屏幕上看到dragginh。

要总结的东西,查看是消失了,因为你叫:

view.setVisibility(View.INVISIBLE); 
在开始

,并没有改变它回来。所以,看到你再次查看你需要插入到你的MyDragListener:

case DragEvent.ACTION_DRAG_ENDED: 
      v.setVisibility(View.VISIBLE); 
      break; 

这是不是说没关系的逻辑发生了什么事,如果听众,查看将在年底可见。

为了您的其他目标,要将视图放在正确的位置,您需要将DragListener注册到视图的父级,以便在DragEvent.ACTION_DRAG_LOCATION中获取拖动过程的位置,保存事件的位置,并在完成拖动的EditText的DragEvent.ACTION_DRAG_ENDED中分配这些值。

+0

谢谢你,我做了改变DragEvent.ACTION_DRAG_ENDED - 似乎没有解决这个问题。您是否建议我在主机活动中编写监听器类?现在,这是在一个片段中完成的,该片段仅覆盖活动的下半部分,但我希望能够将EditText从片段拖到活动本身上(上半部分)。 –

+0

首先尝试通过删除侦听器中除DragEvent.ACTION_DRAG_ENDED之外的所有代码来隔离问题。对于任何其他情况返回true。以这种方式拖动结束时,您应该再次看到您的隐形EditText – yshahak

+0

我刚刚尝试过这一点,但出于某种原因我得到了相同的结果。 EditText只是消失了第二次释放我的水龙头 - 我可以尝试的其他任何东西? –

0

问题是,在退出拖动后,您没有使EditText可见。 所以,取而代之的是你的下面代码:

case 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); 
      break; 

下面代码:

case DragEvent.ACTION_DRAG_EXITED: 
       Log.e(TAG, "Drag Exited"); 
       x_cord = (int) event.getX(); 
       y_cord = (int) event.getY(); 
       View view = (View) event.getLocalState(); 
       view.setX(x_cord - (view.getWidth()/2)); 
       view.setY(y_cord - (view.getWidth()/2)); 
       view.setVisibility(View.VISIBLE); 
       break;