2014-02-17 57 views
9

我在具有三個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; 
      } 
     }; 

我的問題是,我不希望從基礎容器中取出的觀點,它應該呆在那裏,只需添加一個複製到第二個容器。

THX

+0

不那麼容易 - > java.lang.IllegalStateException:指定的子項已經有一個父項。您必須先調用子對象的父對象的removeView()。 – user547995

+0

我認爲問題是該視圖只能在父項。我也不知道「克隆」視圖的方法 – user547995

回答

6

視圖只能有一個家長在任何時刻,你所能做的就是在你的累贅,而不是丟棄的視圖到新容器創建視圖的副本並添加到新的容器。

要克隆一個觀點:如果你查看=>按鈕名爲myButton的,那麼你可以這樣做:

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

您將有原來的按鈕的克隆。這適用於所有其他屬性,如果您想使ImageView的克隆只是創建一個新的並將其drawable設置爲與第一個ImageView相同。

+0

我們如何管理ImageView? –

0

如果您想克隆它,創建的視圖將要求父視圖。因爲一個孩子最多隻能有一個直接父母,所以您必須爲其分配一個相同或不同的父母。

下面是一些谷歌的說明:

當您啓動拖動,則既包括要移動的數據和描述該數據作爲該呼叫到系統的一部分元數據。在拖動過程中,系統將拖放事件發送到佈局中每個視圖的拖動事件偵聽器或回調方法。監聽器或回調方法可以使用元數據來決定是否在數據丟失時接受數據。如果用戶將數據放在View對象上,並且View對象的偵聽器或回調方法先前已告知系統它想接受放置,則系統會在拖動事件中將數據發送到偵聽器或回調方法

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

隨着Android拖/放框架,可以允許用戶將數據從一個視圖使用圖形拖動移動到另一個視圖在當前佈局和下降的手勢。該框架包含一個拖拽事件類,拖拽偵聽器以及輔助方法和類。

這是它的總結。如果您希望保留現有父級視圖,只需在同一父級中創建一個副本,並使其可見性GONE或您需要的任何內容。