2015-12-23 2 views
0

Мне нужно иметь возможность «Добавить кнопку и перетащить ее в папку». По какой-то странной причине я не получаю никаких записей из моего draglistener, и я могу только перемещаться из левой верхней угла в правый нижний угол (!?) при добавлении кнопки я сгореть следующий кодAndroid drag n drop view

@OnClick(R.id.remote_add_button) 
public void addRemoteNewButton() { 
fabMenu.collapse(); 
enableDragAndDropLayout(true); 
View v = new ImageView(getActivity()); 
v.setTag("New button"); 
v.setBackgroundColor(getResources().getColor(R.color.primary_dark)); 
layoutParams = new RelativeLayout.LayoutParams(60, 60); 
layoutParams.setMargins(50, 50, 0, 0); 
remoteContainer.addView(v, layoutParams); 

v.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
     Timber.d("onClick()"); 
     ClipData.Item item = new ClipData.Item((CharSequence) v.getTag()); 
     String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; 

     ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item); 
     View.DragShadowBuilder myShadow = new View.DragShadowBuilder(v); 

     v.startDrag(dragData, myShadow, null, 0); 
     return true; 
    } 
}); 
v.setOnDragListener(new MyDragListener()); 
} 


private class MyDragListener implements View.OnDragListener { 
@Override 
public boolean onDrag(View v, DragEvent event) { 
    int x_cord; 
    int y_cord; 
    int action = event.getAction(); 
    switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
      Timber.i("Action is DragEvent.ACTION_DRAG_STARTED"); 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      x_cord = (int) event.getX(); 
      y_cord = (int) event.getY(); 
      Timber.i("Action is DragEvent.ACTION_DRAG_ENTERED"); 
      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); 
      Timber.i("Action is DragEvent.ACTION_DRAG_EXITED"); 
      break; 
     case DragEvent.ACTION_DRAG_LOCATION: 
      x_cord = (int) event.getX(); 
      y_cord = (int) event.getY(); 
      Timber.i("Action is DragEvent.ACTION_DRAG_LOCATION"); 
      break; 
     case DragEvent.ACTION_DROP: 
      x_cord = (int) event.getX(); 
      y_cord = (int) event.getY(); 
      Timber.i("Action is DragEvent.ACTION_DROP"); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      x_cord = (int) event.getX(); 
      y_cord = (int) event.getY(); 
      Timber.i("Action is DragEvent.ACTION_DRAG_ENDED"); 
      break; 
     default: 
      Timber.i(event.toString()); 
      break; 
    } 
    return true; 
} 
} 

Может any1 мне точку в правильном направлении? Потому что я не могу найти подходящего решения. Я пробовал множество учебников, редактируя код, потому что некоторые просто не имеют никакого смысла. Попробуйте «примеры», но все они дали тот же результат. Любые советы? Был бы потрясающий подарок X-mas, p Приветствия, и наслаждайтесь праздниками!

+0

Этот пример может помочь вам: https://github.com/Humoule/DragDropApplication –

+0

[Android Draggable View] (HTTP: // WWW. singhajit.com/android-draggable-view/) –

ответ

1

Этот пример может помочь вам: github.com/Humoule/DragDropApplication - Фарук Touzi

Благодаря этот комментарий я смог это исправить! :)

Это мое решение проблемы:

public void newButton(){ 
    View newButton = new View(getActivity()); 
    newButton.setTag("New button"); 
    newButton.setBackgroundColor(getResources().getColor(R.color.primary_dark)); 
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100); 
    layoutParams.setMargins(50, 50, 0, 0); 
    dragAndDropLayout.addView(newButton, layoutParams); 

    newButton.setOnTouchListener(new MyTouchListener()); 
    remoteContainer.setOnDragListener(new MyDragListener()); 

} 

private final class MyDragListener implements View.OnDragListener { 
    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     Timber.d("onDrag(%s, %s)", v.toString(), event.toString()); 

     // Store the action type for the incoming event 
     final int action = event.getAction(); 

     // Handles each of the expected events 
     switch (action) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       Timber.i("ACTION_DRAG_STARTED"); 
       // Invalidate the view to force a redraw in the new tint 
       v.invalidate(); 

       // Returns true to indicate that the View can accept the 
       // dragged data. 
       return true; 

      case DragEvent.ACTION_DRAG_ENTERED: 
       Timber.e("ACTION_DRAG_ENTERED"); 
       // Invalidate the view to force a redraw in the new tint 
       v.invalidate(); 

       return true; 

      case DragEvent.ACTION_DRAG_LOCATION: 
       // Ignore the event 
       return true; 

      case DragEvent.ACTION_DRAG_EXITED: 
       Timber.d("ACTION_DRAG_EXITED"); 
       // Invalidate the view to force a redraw in the new tint 
       v.invalidate(); 

       return true; 

      case DragEvent.ACTION_DROP: 
       Timber.v("ACTION_DROP"); 
       // Gets the item containing the dragged data 
       ClipData dragData = event.getClipData(); 
       ViewGroup viewGroup = (ViewGroup) v; 
       for(int i = 0; i < viewGroup.getChildCount();i++){ 
        View child = viewGroup.getChildAt(i); 
        if(child.getTag() != null && child.getTag().equals("New button")){ 

         viewGroup.removeView(child); 

         RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100); 
         layoutParams.setMargins((int) event.getX(), (int) event.getY(), 0, 0); 

         viewGroup.addView(child, layoutParams); 
         child.setVisibility(View.VISIBLE); 
         break; 
        } 
       } 

       // Gets the text data from the item. 
       final String tag = dragData.getItemAt(0).getText().toString(); 

       // Displays a message containing the dragged data. 
       Toast.makeText(getActivity(), "The dragged image is " + tag, Toast.LENGTH_SHORT).show(); 

       // Invalidates the view to force a redraw 
       v.invalidate(); 

       return true; 
      case DragEvent.ACTION_DRAG_ENDED: 
       Timber.w("ACTION_DRAG_ENDED"); 
       // Invalidates the view to force a redraw 
       v.invalidate(); 
       return true; 

      default: 
       break; 
     } 

     return false; 
    } 
} 


private final class MyTouchListener implements View.OnTouchListener { 
    public boolean onTouch(View v, MotionEvent motionEvent) { 
     String tag = v.getTag().toString(); 

     // Instantiates the drag shadow builder 
     View.DragShadowBuilder mShadow; 

     switch (motionEvent.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       ClipData data = ClipData.newPlainText("some label", tag); 
       mShadow = new View.DragShadowBuilder(v); 
       v.startDrag(data, mShadow, null, 0); 
       v.setVisibility(View.GONE); 
       break; 

      case MotionEvent.ACTION_UP: 
       v.performClick(); 
       break; 

      default: 
       break; 
     } 
     return false; 
    } 
}