2016-09-07 5 views
0

空の線形レイアウトの上に表示されるテキストビューがあります。たびに、私はドラッグ&ドロップして線図にテキストビューをドロップする必要があります。ユーザーがドロップを正常に完了しなかった場合、テキストビューがそこにまだ存在している場合に対処できるようにしたい。以下はTouchListenerのための私のコードです:AndroidドラッグアンドドロップTextViewが正しくドロップされないと失われる

private final class MyTouchListener implements 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; 
     } 
    } 
} 

これはDragListener

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

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     int action = event.getAction(); 
     switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       // do nothing 
       break; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       v.setBackgroundDrawable(enterShape); 
       break; 
      case DragEvent.ACTION_DRAG_EXITED: 
       v.setBackgroundDrawable(normalShape); 
       break; 
      case DragEvent.ACTION_DROP: 
       // Dropped, reassign View to ViewGroup 
       View view = (View) event.getLocalState(); 
       ViewGroup owner = (ViewGroup) view.getParent(); 
       owner.removeView(view); 
       LinearLayout container = (LinearLayout) v; 
       container.addView(view); 
       view.setVisibility(View.VISIBLE); 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       v.setBackgroundDrawable(normalShape); 
      default: 
       break; 
     } 
     return true; 
    } 
} 

答えて

0
case DragEvent.ACTION_DROP: 
      // Dropped, reassign View to ViewGroup 
      if(v == (LinearLayout)){     //layout where you want to drop your textview 
       View view = (View) event.getLocalState(); 
       ViewGroup owner = (ViewGroup) view.getParent(); 
       owner.removeView(view); 
       LinearLayout container = (LinearLayout) v; 
       container.addView(view); 
       view.setVisibility(View.VISIBLE); 
      } 
      else 
       view.setVisibility(View.VISIBLE); 
      break; 
+0

線形レイアウトがプログラムによって生成され、それらのレイアウトに設定されたIDが単なる整数値である場合はどうなりますか?しかし、findViewByIdを使用してその整数値を使用しようとすると、IDEはエラーを出しています。 –

+0

動的に追加されたIDを使用するためのソリューションがあります。スタックオーバフローで検索すると、間違いなく解決策が得られます。 – buzzingsilently

+0

API 17&上記で 'View.generateViewId()'メソッドを使用すると、ビューのIDが自動的に割り当てられ、特定のビューが 'View.getChildAt(index)'メソッドを使用して検索されます – buzzingsilently

0
case DragEvent.ACTION_DRAG_ENDED: 
       View view = (View) event.getLocalState(); 
       view.setVisibility(View.VISIBLE); 
       v.setBackgroundDrawable(normalShape); 
       break; 

ための私のコードで私はDragEvent.ACTION_DRAG_ENDED用ケースを編集し、私が探していたソリューションを得ました。

関連する問題