1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Drag and Drop in TableRow

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Terth, 07.10.2011.

  1. Terth, 07.10.2011 #1
    Terth

    Terth Threadstarter Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    04.08.2011
    Hi,

    ich benötige für meine App eine Anordnung von Buttons per Drag and Drop. Ich möchte die Buttons in den TableRows eines TableLayouts droppen. Dafür habe ich mir einen DragListener geschrieben der darauf horcht wenn ein Drag von einem Button gestartet wird. Der Button den man verschieben kann liegt als Muster immer auf der GUI und erzeugt beim loslassen in einer TableRow eine neue Buttoninstanz. Jetzt das eigentliche Problem: Ich kann in eine TableRow nur etwas droppen wenn in ihr schon ein Control, wie z.B. ein TextView liegt. Sonst schaffe ich es nicht das ACTION_DRAG_ENTERED oder EXITED auszulösen. Wie kann ich es einrichten das jede leere TableRow mit einer Größe von zum Beispiel 50 x 300 Pixeln dargestellt wird. Ich habe schon probiert in der XML Datei dem TableLayout eine feste größe zu geben und die Row auf Layout width/height match_parent zu setzen oder einfach beiden eine feste Größe zu geben. Aber anscheinend ist eine Row nur ansteuerbar wenn sie ein Control als Kindelement hat.
    Hier ist mein Code main.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/button_DragPattern" android:text="DragMe"></Button>
        <TableLayout android:layout_height="50dp" android:layout_width="300dp" android:id="@+id/tableLayout_DropContainer">
            <TableRow android:layout_width="match_parent" android:id="@+id/tableRow_DropRow" android:layout_height="match_parent">
            </TableRow>
        </TableLayout>
    </LinearLayout>
    Code Activity (wenn ich hier die TextViews einkommentiere klappt es so wie ich möchte, aber das wär ein doofer Workaround das muss doch auch anders gehen)
    Code:
    package TableDnD.Activities;
    
    import android.app.Activity;
    import android.content.ClipData;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.DragEvent;
    import android.view.View;
    import android.view.View.DragShadowBuilder;
    import android.view.View.OnDragListener;
    import android.view.View.OnLongClickListener;
    import android.widget.Button;
    import android.widget.TableLayout;
    import android.widget.TableRow;
    import android.widget.TextView;
    
    public class TableDnDActivity extends Activity 
    {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            TableRow tr = (TableRow)findViewById(R.id.tableRow_DropRow);
            /*TextView tv = new TextView(this);
            tv.setText("HUHU");
            tr.addView(tv);*/
            tr.setOnDragListener(new BoxDragListener());
            
            Button b = (Button)findViewById(R.id.button_DragPattern);
            b.setOnLongClickListener(new OnLongClickListener() 
            {
                public boolean onLongClick(View v) 
                {
                    ClipData data = ClipData.newPlainText("foo","bar");
                    DragShadowBuilder shadowBuilder = new DragShadowBuilder(v);
                    v.startDrag(data, shadowBuilder, v, 0);
                    return false;
                }
            });
            
            /*TableLayout tl = (TableLayout)findViewById(R.id.tableLayout_DropContainer);
            tl.setOnDragListener(new BoxDragListener());*/
        }
        
        public Context getGlobalContext()
        {
            return this;
        }
        
        class BoxDragListener implements OnDragListener
        {
            boolean m_bInsideOfMe = false;
            
            public boolean onDrag(View self, DragEvent event) 
            {
                if (event.getAction() == DragEvent.ACTION_DRAG_STARTED)
                {
                    
                } 
                else if (event.getAction() == DragEvent.ACTION_DRAG_ENTERED)
                {
                    self.setBackgroundColor(Color.BLUE);
                    //((TableRow)self).setBackgroundColor(Color.BLUE);
                    m_bInsideOfMe = true;
                } 
                else if (event.getAction() == DragEvent.ACTION_DRAG_EXITED)
                {
                    self.setBackgroundColor(Color.BLACK);
                    //((TableRow)self).setBackgroundColor(Color.BLACK);
                    m_bInsideOfMe = false;
                } 
                else if (event.getAction() == DragEvent.ACTION_DROP)
                {
                    if (m_bInsideOfMe)
                    {
                        // hier befinde ich mich in einer TableRow und lasse den Button los nun sollte er linksbündig in der
                        // Row eingefügt werden und gleichzeitig wenn die Row in die der Button gedroppt wurde die zuletzt zum
                        // TableLayout hinzugefügte ist eine neue Row hinzufügen in die auch gedroppt werden könnte
                        // Pseudocode (so stelle ich mir das in etwa vor):
                        
                        TableRow container = (TableRow) self;
                        container.addView(new Button(getGlobalContext()));
                        TableLayout parent = (TableLayout)container.getParent();
                        int i = 0;
                        while(!parent.getChildAt(i).equals(container))
                        {
                            i++;
                        }
                        if(i == parent.getChildCount()-1)
                        {
                            TableRow tr = new TableRow(getGlobalContext());
                            tr.setOnDragListener(new BoxDragListener());
                            /*TextView tv = new TextView(getGlobalContext());
                            tv.setText("HUHU");
                            tr.addView(tv);*/
                            parent.addView(tr);
                        }
                        ((TableRow)self).setBackgroundColor(Color.BLACK);
                    }
                } 
                else if (event.getAction() == DragEvent.ACTION_DRAG_ENDED)
                {
                        
                }
                return true;
            }
        }
    }
    vielen Dank
    Liebe Grüße
    Terth
     

Diese Seite empfehlen