拖放而不从所有者中删除

Posted

技术标签:

【中文标题】拖放而不从所有者中删除【英文标题】:Drag & Drop without removal from owner 【发布时间】:2014-03-16 18:23:51 【问题描述】:

我正在使用带有三个 TextView 拖放的 LinearLayout 将其移动到另一个容器。 我的代码:

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;
            
        ;

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

谢谢

【问题讨论】:

没那么容易 -->java.lang.IllegalStateException: 指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。 我认为问题在于视图只能在父级上。我也不知道“克隆”视图的方法 【参考方案1】:

视图在任何给定时刻只能有一个父视图,您可以做的是拖动,而不是将视图拖放到新容器中,而是创建视图的克隆并将其添加到新容器中。

要克隆视图:如果您的视图 => Button 名为 myButton,那么您可以这样做:

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

您将获得原始按钮的克隆。这适用于所有其他属性,如果您想克隆 ImageView,只需创建一个新属性并将其可绘制对象设置为与第一个 ImageView 相同的属性。..

【讨论】:

【参考方案2】:

如果你想克隆它,那么新创建的视图会要求一个父视图。因为孩子最多可以有一个直接父母,因此您必须为其分配相同或不同的父母。

这是一些谷歌描述:

当您开始拖动时,您将包含正在移动的数据和描述该数据的元数据,作为对系统的调用的一部分。在拖拽过程中,系统会向布局中各个View的拖拽事件监听器或回调方法发送拖拽事件。侦听器或回调方法可以使用元数据来决定是否要在数据被删除时接受数据。如果用户将数据拖放到 View 对象上,并且该 View 对象的侦听器或回调方法之前已告诉系统它想要接受拖放,则系统会在拖动事件中将数据发送到侦听器或回调方法

Please read this for detail. It will help you alot....

借助 android 拖放框架,您可以允许用户使用图形拖放手势将数据从一个视图移动到当前布局中的另一个视图。该框架包括一个拖动事件类、拖动侦听器以及辅助方法和类。

这是它的总结。如果您想在现有父级中保留视图,只需在同一父级中复制一份并使其可见性消失或您需要的任何内容。

【讨论】:

以上是关于拖放而不从所有者中删除的主要内容,如果未能解决你的问题,请参考以下文章

HTNL5新特性 之 拖放

如何在拖放时克隆 div 而不是在拖动开始时克隆

Javafx 可检索的拖放错误

Javascript拖放:成功拖放后删除拖动的元素

如何在 obj-c 中拖放“.txt”文件

在两个表之间拖放