2013-06-18 23 views
3

我正在進行拖放應用程序,一切正常,但我看到一個問題。我有3個ImageViews,其中兩個是可拖動的對象,另一個是放置目標。每次我將物體放在除放置目標以外的任何位置時,它都會完全消失!Android拖放問題不顯示

下面是我使用的代碼:

 ImageView iv1, iv2, iv3; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    initControls(); 

} 

private void initControls() { 
    // TODO Auto-generated method stub 

    iv1 = (ImageView) findViewById (R.id.imageView1); 
    iv2 = (ImageView) findViewById (R.id.imageView2); 

    iv1.setTag("a"); 
    iv2.setTag("b"); 

    iv3 = (ImageView) findViewById (R.id.imageView3); 
    iv1.setOnTouchListener(new MyTouchListener()); 
    iv2.setOnTouchListener(new MyTouchListener()); 
    iv3.setOnDragListener(new MyDragListener()); 

} 

private final class MyTouchListener implements OnTouchListener { 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
     ClipData data = ClipData.newPlainText("", ""); 
     DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
     view.startDrag(data, shadowBuilder, view, 0); 
     view.setVisibility(View.INVISIBLE); 
     return true; 
     } else { 
     return false; 
     } 
    } 
} 

class MyDragListener implements OnDragListener { 
    //Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget); 
    //Drawable normalShape = getResources().getDrawable(R.drawable.shape); 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_LOCATION: 
      if(v != iv3) 
       v.setVisibility(View.VISIBLE); 
     break; 
     case DragEvent.ACTION_DRAG_STARTED: 
     // Do nothing 
     break; 
     case DragEvent.ACTION_DRAG_ENTERED: 

     break; 
     case DragEvent.ACTION_DRAG_EXITED: 

     break; 
     case DragEvent.ACTION_DROP: 

     // Dropped, reassign View to ViewGroup 
     //handle the dragged view being dropped over a drop view 
     View view = (View) event.getLocalState(); 

     Drawable dropshadow = getResources().getDrawable(R.drawable.dropshadow); 

     //view dragged item is being dropped on 
     ImageView dropTarget = (ImageView) v; 

     //view being dragged and dropped 
     ImageView dropped = (ImageView) view; 

     /* 
     //if an item has already been dropped here, there will be a tag 
     Object tag = dropTarget.getTag(); 

     //if there is already an item here, set it back visible in its original place 
     if(tag!=null) 
     { 
      //the tag is the view id already dropped here 
      int existingID = (Integer)tag; 
      //set the original view visible again 
      findViewById(existingID).setVisibility(View.VISIBLE); 

     } 

     //set the tag in the target view to the ID of the view being dropped 
     dropTarget.setTag(dropped.getId()); 
     */ 


       String temp = "a"; 
       if(temp.equals(view.getTag())){ 
        //dropped.setBackground(dropshadow); 
        dropTarget.setBackground(dropshadow); 
        Log.d(temp, "Correct Image"); 
       } else { 
        Log.d("b", "Wrong Image"); 
        view.setVisibility(View.VISIBLE); 
       } 



     break; 
     case DragEvent.ACTION_DRAG_ENDED: 

     default: 
     break; 
     } 
     return true; 
    } 
} 

什麼我這裏缺少什麼?任何幫助是真正的讚賞。謝謝。

回答

5

最後我自己解決了這個問題。我加入這個方法:

private boolean dropEventNotHandled(DragEvent dragEvent) { 
      return !dragEvent.getResult(); 
} 

,並將此:

case DragEvent.ACTION_DRAG_ENDED: 
      if (dropEventNotHandled(event)) 
       view.setVisibility(View.VISIBLE); 
     break; 
1

所以,當你開始拖動 - motionEvent.getAction() == MotionEvent.ACTION_DOWN - 你執行view.setVisibility(View.INVISIBLE);

但是當你停止拖動,你沒有做任何事情的看法。所以我猜你的視圖對象仍然是不可見的。添加一條類似的條件語句,以便在拖動完成時將可見性翻轉回可見狀態。

關閉我的頭頂,假設MotionEvent.ACTION_UP是拖動事件的結束,添加後的第一個後,如果您onTouch方法塊

else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
    view.setVisibility(View.VISIBLE); 
    return true 
} 

保持最後的「else」塊以及。

+0

你知道如何做到這一點? –

+0

查看編輯 - 但你應該能夠從你現有的代碼和我的評論中解決它。 – Phil

+0

試過這個,但還沒有出現。 –