2014-02-17 6 views
9

ich mit drei Textviews auf einem Linearlayout bin mit Drag & Drop in einen anderen Behälter zu bewegen. Mein Code:Drag & Drop ohne Entfernung vom Eigentümer

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

Mein Problem ist, dass ich mag nicht den Blick von dem Basisbehälter zu entfernen, sollte es dort bleiben und nur eine Kopie an den zweiten Behälter hinzuzufügen.

Thx

+0

Es ist nicht so einfach -> java.lang.IllegalStateException: Das angegebene Kind hat bereits einen Elternteil. Sie müssen zuerst removeView() für das übergeordnete Element des Kindes aufrufen. – user547995

+0

Ich denke, das Problem ist, dass die Ansicht nur auf Eltern haben kann. Ich kenne auch keine Möglichkeit, eine Ansicht zu "klonen" – user547995

Antwort

6

Ein Blick nur einen Elternteil zu einem bestimmten Zeitpunkt haben kann, was Sie können auf Ihrem Drag zu tun ist, statt den Blick in die neuen Container einen Klon der Ansicht erstellen löschen und hinzufügen, dass auf der neue Behälter.

eine Ansicht klonen: Wenn Ihre Ansicht => Button myButton genannt, dann können Sie dies tun:

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

Sie einen Klon der ursprünglichen Taste haben. Dies gilt für jede andere Eigenschaft. Wenn Sie einen ImageView-Klon erstellen möchten, erstellen Sie einfach einen neuen und setzen Sie ihn so, dass er gleich dem ersten ImageView ist.

+0

Wie können wir für ImageView verwalten? –

0

Wenn Sie ihn klonen möchten, dann ist er neu Die erstellte Ansicht fragt nach einer übergeordneten Ansicht. Da ein Kind höchstens einen direkten Elternteil haben kann, müssen Sie ihm einen gleichen oder einen anderen Elternteil zuweisen.

Hier einige google Beschreibung:

Wenn Sie eine Drag beginnen, schließen Sie sowohl die Daten, die Sie bewegen und Metadaten diese Daten als Teil des Aufrufs an das System zu beschreiben. Während des Ziehens sendet das System Ziehereignisse an die Drag-Ereignis-Listener oder Callback-Methoden jeder Ansicht im Layout. Die Listener oder Callback-Methoden können die Metadaten verwenden, um zu entscheiden, ob sie die Daten akzeptieren möchten, wenn sie gelöscht werden. Wenn der Benutzer die Daten über einen View-Objekt fällt, und das View-Objekt des Zuhörers oder Callback-Methode hat zuvor gesagt, das System, das sie will den Tropfen akzeptieren, dann sendet das System die Daten an den Hörer oder Callback-Methode in einem Drag-Ereignis

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

Mit dem Android Drag/Drop-Rahmen können Sie Ihren Benutzern erlauben, Daten von einem Blick auf eine andere Ansicht im aktuellen Layout mit Hilfe einer grafischen Drag-and-Drop-Geste zu bewegen. Das Framework enthält eine Drag-Ereignisklasse, Drag Listeners und Hilfsmethoden und -klassen.

Dies ist eine Zusammenfassung davon. Wenn Sie die Ansicht im vorhandenen Elternteil behalten möchten, erstellen Sie einfach eine Kopie im selben Elternteil und machen Sie die Sichtbarkeit GONE oder was auch immer Sie benötigen.