2014-02-10 27 views
1

我遇到了以下問題: 我想爲LinearLayout實現View.DragOnListener。當我長時間點擊屏幕時,OnDrag方法收到DragEvent.ACTION_DRAG_STARTED,但是當我釋放拖動在屏幕上時。此方法無法接收DragEvent.ACTION_DROP。 希望得到大家的幫助。在這裏我的代碼:OnDrag無法接收DragEvent.ACTION_DROP

package com.example.dragdroptestapp; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.DragEvent; 
import android.view.View; 
import android.widget.LinearLayout; 

public class MyLinearLayout extends LinearLayout implements View.OnDragListener{ 

    private final String TAG = "MyLinearLayout"; 
    public MyLinearLayout(Context context) { 
     super(context); 
     initLongClick(); 

    } 


    public MyLinearLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initLongClick(); 
    } 


    public MyLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initLongClick(); 
    } 

    @Override 
    public boolean onDragEvent(DragEvent event) { 
     final int action = event.getAction(); 
     switch (action) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      Log.e(TAG, "Started"); 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      Log.e(TAG, "Entered"); 
      break; 
     case DragEvent.ACTION_DROP: 
      Log.e(TAG, "Droped"); 
      break; 
     default: 
      Log.e(TAG, "action event" + String.valueOf(action)); 
      break; 
     } 
     return true; 
    } 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     Log.e(TAG, "onDrag"); 
     final int action = event.getAction(); 
     switch (action) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      Log.e(TAG, "Started"); 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      Log.e(TAG, "Entered"); 
      break; 
     case DragEvent.ACTION_DROP: 
      Log.e(TAG, "Droped"); 
      break;  
     default: 
      break; 
     } 
     return true; 
    } 
    private void initLongClick() { 
     setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 

       Log.e(TAG, "LongClick"); 
       View.DragShadowBuilder myShadow = new DragShadowBuilder(v); 
       v.startDrag(null, myShadow, null, 0); 

       return true; 
      } 
     }); 
    } 


} 

回答

1

我也有同樣的問題,ACTION_DROP通常不接收由於以下幾個原因:1。 應OnDragListner佈局上應用而不是在視圖 2.您應返回true,而不是突破;從ACTION_DRAG_STARTED彷彿它不會是真的,它會繼續下一個行動。所以從每個ACTION返回true

因此,如果您正在調用視圖然後將其更改爲佈局,那麼說明您在設置OnDrag佈局還是視圖方面有點難。

接下來,不是從OnDragEvent中的每個ACTION中斷開,而是返回true。這應該可以解決你的問題。

我希望我幫助

2

我剛剛完成摔跤類似的問題。神祕地接收ACTION_DRAG_STARTED和ACTION_DRAG_ENDED而不是ACTION_DROP的視圖位於另一個也在監聽拖動事件的更大視圖之下(但是如果它們被放置在特定區域中,它們只會對它們做任何事情)。

我通過向XML佈局文件的頂部移動較大的數據來解決此問題,該佈局文件將其放在較小的View的「底部」。

0

下面的代碼可能會幫助其他正在解決類似問題的人。

package com.javapapers.android.drag_drop; 
import android.os.Bundle; import android.app.Activity; 
import android.view.*; 
import android.view.View.OnDragListener; 
import android.view.View.OnTouchListener; 
import android.view.View.DragShadowBuilder; 
import android.widget.LinearLayout; 
import android.util.Log; 
import com.javapapers.android.drag_drop.R; 

public class MainActivity extends Activity implements OnTouchListener, OnDragListener { 
    private static final String LOGCAT = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     findViewById(R.id.textView1).setOnTouchListener(this); 
     findViewById(R.id.pinkLayout).setOnDragListener(this); 
     findViewById(R.id.yellowLayout).setOnDragListener(this); 
    } 

    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(null, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public boolean onDrag(View layoutview, DragEvent dragevent) { 
     int action = dragevent.getAction();  
     switch (action) {  
      case DragEvent.ACTION_DRAG_STARTED: 
      Log.d(LOGCAT, "Drag event started"); 
      break; 

      case DragEvent.ACTION_DRAG_ENTERED: 
      Log.d(LOGCAT, "Drag event entered into " + layoutview.toString()); 
      break; 

      case DragEvent.ACTION_DRAG_EXITED: 
      Log.d(LOGCAT, "Drag event exited from "+layoutview.toString()); 
      break; 

      case DragEvent.ACTION_DROP: 
      Log.d(LOGCAT, "Dropped"); 
      View view = (View) dragevent.getLocalState(); 
      ViewGroup owner = (ViewGroup) view.getParent(); 
      owner.removeView(view); 
      LinearLayout container = (LinearLayout) layoutview; 
      container.addView(view); 
      view.setVisibility(View.VISIBLE); 
      break; 

      case DragEvent.ACTION_DRAG_ENDED: 
      Log.d(LOGCAT, "Drag ended"); 
      break; 

      default: 
      break; 
     } 
    return true; 
}