1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. Terth, 07.10.2011 #1
    Terth

    Terth Threadstarter Neuer Benutzer

    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
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGT] Bei Klick auf Imagebutton das Bild darin ändern Android App Entwicklung 12.08.2017
[OFFEN] App Beschreibung im Store nachträglich ändern Android App Entwicklung 20.04.2017
[ERLEDIGT] Font Color in einem ChangeLog für 1 Wort ändern Android App Entwicklung 19.03.2017
[ERLEDIGT] Hintergrundfarbe einer app ändern Android App Entwicklung 18.03.2017
[ERLEDIGT] Buttontext per klick ändern Android App Entwicklung 14.03.2017
AsyncTask ProgressDialog ändern Android App Entwicklung 21.02.2017
Farben ändern und permanent speichern Android App Entwicklung 19.01.2017
Button Titel bei Klick ändern Android App Entwicklung 17.01.2017
Drawerlist Markierter Einträg ändern Android App Entwicklung 17.11.2016

Users found this page by searching for:

  1. android tablelayout drag and drop

    ,
  2. drop row

    ,
  3. html dragdrop tablerow

Du betrachtest das Thema "Drag and Drop in TableRow" im Forum "Android App Entwicklung",