Implementieren Sie das Drag-Element auf die Bildschirmkante

Ich muss die aktuelle Registerkarte ändern, wenn das Element in der Nähe der Bildschirmkante (links oder rechts) gezogen wird.

Es gibt kein Problem mit Drag-N-Drop-Feature und aktuelle Registerkarten. Ich kann dieses Ereignis nicht richtig behandeln – wenn das gezogene Element in der Nähe des Bildschirms liegt.

Wie würdest du das machen?

Was ich versuchte:

<FrameLayout android:id="@+id/left_toggle_area" android:layout_width="30dp" android:layout_height="fill_parent" android:layout_alignParentStart="true" android:layout_alignParentLeft="true"> </FrameLayout> <FrameLayout android:id="@+id/right_toggle_area" android:layout_width="30dp" android:layout_height="fill_parent" android:layout_alignParentEnd="true" android:layout_alignParentRight="true"> </FrameLayout> <GridView android:layout_width="match_parent" android:layout_height="match_parent" ... /> 

Die Idee ist, die aktuelle Registerkarte programmgesteuert zu ändern, wenn das gezogene Element im Toggle-Bereich.

Aber die Veranstaltung DragEvent.ACTION_DRAG_ENTERED auf diesem Bereich tritt nie auf, da (ich glaube so) das GridView den ganzen Bildschirm und einfach überlappt mit toggle Bereichen.

Ich habe schon versucht, diese Bereiche an die Front zu bringen, wenn das Drag-Start-Ereignis ausgelöst wird. Aber das klappt aus irgendeinem Grund nicht.

 FrameLayout toggleView = (FrameLayout) v; toggleView.bringToFront(); toggleView.requestLayout(); toggleView.invalidate(); 

Wenn jemand ein solches Problem konfrontiert, bitte teilen Sie Ihre Erfahrung. Oder vielleicht gibt es noch eine bessere Lösung dafür. Bitte geben Sie mir einen Hinweis.

  • Stackoverflow-Fehler auf View Drag Drop Update
  • Drag & Drop in RecyclerView mit GridLayoutManager
  • Wie kann ich per Drag & Drop mehrere Bildansichten über andere Imageviews android
  • OnDragListener - gibt es eine Kompatibilitätsbibliothek für Android Levels <11?
  • Wie kann ich per Drag & Drop mit mehreren Aktivitäten?
  • Wie ziehe ich ein Element aus einer Listenansicht und lege es auf eine externe Textansicht?
  • Jquery Drag Drop hängt oder wird für Android Browser stecken
  • Wie bekomme ich einen Schnittpunkt von zwei Zeilen (ImageViews)
  • 2 Solutions collect form web for “Implementieren Sie das Drag-Element auf die Bildschirmkante”

    Die aktuelle Lösung, die ich komme, die funktioniert (mehr oder weniger) ist die Verwendung von TextView in PagerTabStrip Titel als Drag-Bereich verschachtelt. Die größte Konkurrenz in diesem Ansatz ist, dass diese Toggle-Bereiche aus irgendeinem Grund zu klein sind. ENTER-Ereignis löst nur in diesen Bereichen aus.

    Bildbeschreibung hier eingeben

    Ich glaube, diese Lösung wäre gut mit Oldschool-Tabs. Hier ist also der Code. Kann für jemanden nützlich sein

    1). Parse TextViews von PagerTabStrip

     private ArrayList <TextView> titles; ... public void setPager(PagerTabStrip mPagerTabStrip) { for (int i = 0; i < mPagerTabStrip.getChildCount(); ++i) { View nextChild = mPagerTabStrip.getChildAt(i); if (nextChild instanceof TextView) { TextView textViewToConvert = (TextView) nextChild; if (textViewToConvert.getText().toString().contains(TabsFragment.TAG_MONITOR)){ // I take only few tabs if (!titles.contains(textViewToConvert)) { titles.add(textViewToConvert); } } } } } public ArrayList<TextView> getTitles() { return titles; } 

    Nach dieser Operation habe ich 3 TextViews, die Drag'n'Drop Navigation benötigen.

    2). TextViews Sie Ihre Liste der TextViews in die Klasse, in der Sie DragListeners implementieren:

      public void setUpDragNDropTabMoves(ArrayList<TextView> views) { if (views != null) { for (TextView tv : views){ tv.setOnDragListener(TabToggleDragListener); } } } 

    3). Und der Zuhörer selbst

      View.OnDragListener TabToggleDragListener = new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { TextView toggleView = (TextView) v; String title = toggleView.getText().toString(); switch (event.getAction()) { case DragEvent.ACTION_DROP: ... break; case DragEvent.ACTION_DRAG_ENTERED: int tabId = -1; //define which tab is destination if (title.contains(TabsFragment.TAG_MONITOR1)){ tabId = 1; } else if (title.contains(TabsFragment.TAG_MONITOR2)){ tabId = 2; } else if (title.contains(TabsFragment.TAG_MONITOR3)){ tabId = 3; } //send event to tab host fragment/activity and perform tab change to passed index //you may use EventBus or Otto for this. I used Local Broadcast BroadcastSender.sendMessageToUI(getContext(), BroadcastSender.TABS_FRAGMENT, BroadcastActions.TF_TOGGLE_TAB, tabId ); break; case DragEvent.ACTION_DRAG_EXITED: ... break; case DragEvent.ACTION_DRAG_ENDED: ... break; } return true; } }; 

    Ich nehme es die Eltern der drei Ansichten (toggle Bereiche und die GridView ) ist ein RelativeLayout . Zuerst ersetzen Sie das GridView , um das erste Kind seines Elternteils zu sein. Lassen Sie den Rest des Layouts genau so, wie sie sind.

    Zweitens, um das Drop-Event mit der View.OnDragListener Schnittstelle zu View.OnDragListener , müssen Sie die minimale SDK-Version auf 11 in der AndroidManifest.xml . Danach können Sie den Zuhörer in die Toggle-Bereiche übergeben:

     View.OnDragListener dragListener = new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { // you can check for event.ACTION_DRAG_ENTERED here return true; } }; FrameLayout leftToggleArea = (FrameLayout) findViewById(R.id.left_toggle_area); leftToggleArea.setOnDragListener(dragListener); 

    Falls ihr noch Probleme habt, posten Sie mehr von Ihrem Code.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.