2015-12-18 13 views
7

È necessario implementare il cambiamento di scheda corrente quando l'elemento viene trascinato vicino al bordo dello schermo (a sinistra oa destra).Implementare l'elemento di trascinamento sulla feature del bordo dello schermo

Non c'è alcun problema con la funzione di trascinamento N trascinamento e gli interruttori di scheda corrente. Non riesco a gestire correttamente questo evento: quando l'oggetto trascinato è vicino al bordo dello schermo.

Come lo faresti?

Quello che ho provato:

<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" 
    ... /> 

L'idea è quella di cambiare scheda corrente di codice quando l'elemento trascinato a zona ginocchiera.

Ma l'evento DragEvent.ACTION_DRAG_ENTERED in quell'area non si verifica mai da quando (credo) l'GridView occupa l'intero schermo e si sovrappone semplicemente con le aree di commutazione.

Ho provato a portare queste aree in primo piano all'avvio dell'evento di trascinamento. Ma questo non funziona per qualche motivo.

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

Se qualcuno dovesse affrontare questo problema, condividi la tua esperienza. O forse c'è un'altra soluzione migliore per questo. Per favore dammi un suggerimento.

+0

Ho pubblicato la mia soluzione corrente. Ma preferisco ancora utilizzare le aree di trascinamento menzionate in questione. Quindi, per favore, benvenuto se qualcuno ha idee. – AnZ

+0

quindi non vuoi cadere e cambiare ancora la scheda? –

+0

Sì, desidero modificare la scheda corrente con l'evento 'DragEvent.ACTION_DRAG_ENTERED' – AnZ

risposta

3

Io lo prendo il genitore delle tre visualizzazioni (le aree di commutazione e il GridView) è un RelativeLayout. Prima di tutto, sostituire GridView, per essere il primo figlio del suo genitore. Lascia il resto del layout esattamente come sono.

In secondo luogo, per rilevare l'evento di rilascio con l'interfaccia View.OnDragListener, è necessario impostare la versione minima dell'SDK su 11 in AndroidManifest.xml. Dopo che è possibile passare l'ascoltatore alle aree a levetta:

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

Nel caso in cui si hanno ancora problemi, inviare più del vostro codice.

+0

Non ci sono problemi con l'installazione di trascinatori di trascinamento. Ho fatto esattamente quello che hai scritto qui. Il problema è event.ACTION_DRAG_ENTERED non si verifica mai nelle aree di commutazione. – AnZ

3

L'attuale soluzione a cui lavoro (più o meno) è utilizzare TextView nidificato nel titolo PagerTabStrip come area di trascinamento. La più grande truffa in questo approccio è che quelle aree di commutazione sono troppo piccole per qualche motivo. L'evento ENTER si attiva solo in quelle aree.

enter image description here

I belive questa soluzione sarebbe bene con le schede oldschool. Quindi ecco il codice. Potrebbe essere utile per qualcuno.

1). Analizzare TextViews da 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; 
} 

Dopo questa operazione ho 3 TextViews che hanno bisogno di navigazione drag'n'drop.

2). Passate il vostro elenco di TextViews alla classe in cui si sceglie di implementare DragListeners:

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

3).E l'ascoltatore stesso

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