2015-08-15 96 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;