拖放没有从所有者删除

我在一个LinearLayout上使用了三个TextViews Drag&Drop将其移动到另一个容器。 我的代码:

OnDragListener dragi = new OnDragListener() { @Override public boolean onDrag(View arg0, DragEvent arg1) { // TODO Auto-generated method stub int action = arg1.getAction(); switch (action) { case DragEvent.ACTION_DRAG_STARTED: break; case DragEvent.ACTION_DRAG_ENTERED: break; case DragEvent.ACTION_DRAG_EXITED: break; case DragEvent.ACTION_DROP: View view = (View) arg1.getLocalState(); ViewGroup owner = (ViewGroup) view.getParent(); owner.removeView(view); // LinearLayout container = (LinearLayout) arg0; container.addView(view); view.setVisibility(View.VISIBLE); } break; case DragEvent.ACTION_DRAG_ENDED: break; default: break; } return true; } }; 

我的问题是,我不想从基本容器中删除视图,它应该呆在那里,只是添加一个副本到第二个容器。

谢谢

  • 无法在android studio中拖放简单的imageView
  • 拖放onDraglisteneranimation回到原来的位置,如果不放在目标上
  • 是否有可能将项目拖到RecyclerView之外?
  • Android GridView通过拖放来重新排列元素
  • 在Android 4+ ListView中重新sorting项目的最佳方法
  • 拖放到一个ListView中
  • Android Studio中的拖放function无法正常工作
  • 使用WindowManager.addView添加dynamic视图
  • 一个视图在任何给定的时刻只能有一个父对象,你可以做的就是拖动视图,而不是将视图放到新的容器中,创build一个视图的副本并将其添加到新的容器中。

    克隆一个视图:如果你的视图=>button叫myButton,那么你可以这样做:

     Button myButtonClone = new Button(context); myButtonClone.setText(myButton.getText()); 

    你将有一个原始button的克隆。 这适用于所有其他属性,如果您想要创build一个ImageView的副本,只需创build一个新的,并将其drawable设置为与第一个ImageView相同。

    如果你想克隆它,比新创build的视图将要求父视图。 因为一个孩子最多只能有一个直接父母,所以你必须给父母分配一个相同或不同的父母。

    这里是一些谷歌的描述:

    当您开始拖动时,您将包含要移动的数据以及描述此数据的元数据,作为系统调用的一部分。 在拖动过程中,系统将拖放事件发送到布局中每个视图的拖动事件侦听器或callback方法。 监听器或callback方法可以使用元数据来决定是否在数据被丢弃时接受数据。 如果用户通过View对象删除数据,并且View对象的侦听器或callback方法先前已经告知系统它希望接受该删除,则系统会在拖动事件中将数据发送到侦听器或callback方法

    请阅读这个细节。 它会帮助你很多….

    使用Android拖放框架,您可以允许用户使用graphics拖放手势将数据从一个View移动到另一个View中。 该框架包括一个拖拽事件类,拖拽监听器和帮助器方法和类。

    这是它的总结。 如果您想保留现有父级视图,只需在同一父级中创build一个副本,并使其可见性GONE或您需要的任何内容即可。