2011-12-19 5 views
0

私のアプリケーションでは、ビューグループを設計したいと思います。このビューグループにテキストビューなどのコンテンツを追加すると、テキストビューはDragEventを受け入れることができます。 私はandroid4.0でビューの受け入れドロップイベントを作成する方法は?

@Override 
public void addView(View child) { 
    super.addView(child); 
    child.setOnDragListener(new ViewDragger()); 
    child.setOnLongClickListener(new DragStarter()) ; 
} 

class DragStarter implements OnLongClickListener{ 
    @Override 
    public boolean onLongClick(View v) { 

     ClipData.Item item = new ClipData.Item((CharSequence) v.getTag()); 
     ClipData dragData = new ClipData((CharSequence) v.getTag(),new String[]{"*/*"},item); 
     View.DragShadowBuilder builder = new View.DragShadowBuilder(v); 
     boolean started = v.startDrag(dragData, builder, v , 0) ; 
     System.out.println("start drag " + started+" " + v); 
     return false; 
    } 
} 

class ViewDragger implements OnDragListener{ 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     if(event.getAction() == DragEvent.ACTION_DRAG_ENDED){ 
      System.out.println("drag end"); 
     } 
     if(event.getAction() == DragEvent.ACTION_DRAG_ENTERED){ 
      System.out.println("drag entered."); 
     } 
     if(event.getAction() == DragEvent.ACTION_DRAG_EXITED){ 
      System.out.println("drag existed."); 
     } 
     if(event.getAction() == DragEvent.ACTION_DRAG_LOCATION){ 
      System.out.println("drag location"); 
     } 
     if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){ 
      System.out.println("drag started."); 
     } 
     if(event.getAction() == DragEvent.ACTION_DROP){ 
      System.out.println("action drop"); 
      return true ; 
     } 
     System.out.println("view-->" + v); 
     return false; 
    } 

}` 

以下のコードを使用して、それを試してみました。しかし、私は期待通りの機能は実行されません。 1つのテキストビューをロングクリックすると、すべてのDragListenerが呼び出され、「ドラッグ開始」と「ドラッグ終了」だけが表示されます。私はAPIDemoでデモを読んでいましたが、ドラッグイベントを通常のウィジェットに使うことができます。何かアドバイス? THX

答えて

4

ACTION_DRAG_STARTEDを受け取ったときに本当に反応しなかったためです。

if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){ 
      System.out.println("drag started."); 
      return true; 
} 

あなたが開始したイベントを取得し、あなたがそのオブジェクトによって将来のドラッグイベントをリッスンするように登録する際に真のリターンを追加します。

1

私のアクティビティに画像ビューを追加し、特定の位置にドラッグアンドドロップするのに使用しました。 ドラッグ・リスナーをレイアウトに設定します。

public class MainActivity extends Activity 
{ 

private ImageView image; 
private AbsoluteLayout my; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    my=(AbsoluteLayout)findViewById(R.id.my); 
    image =(ImageView)findViewById(R.id.imageView1); 
    my.setOnDragListener(new View.OnDragListener() 
    { 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){ 
      System.out.println("drag started."); 
      return true; 
} 
    if(event.getAction()==DragEvent.ACTION_DROP) 
     { 
     image.setX(event.getX()); 
     image.setY(event.getY()); 
      System.out.println("DROP ENTERED"); 
      return true; 
    } 
    else 
      return false; 
    } 
}); 

    image.setOnTouchListener(new View.OnTouchListener() { 


    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction()==MotionEvent.ACTION_DOWN) 
     { 
      View.DragShadowBuilder bu=new View.DragShadowBuilder(v); 
      ClipData clp=ClipData.newPlainText("", ""); 

      v.startDrag(clp,bu,(ImageView)v,0); 


     return true; 
     } 
     else 

     return false; 
    } 
}); 



} 
} 
関連する問題