2015-12-18 6 views
7

アイテムを画面の端(左または右)近くにドラッグすると、現在のタブの変更を実装する必要があります。ドラッグ項目をスクリーンエッジフィーチャーに実装する

ドラッグアンドドロップ機能と現在のタブスイッチに問題はありません。私はちょうどこのイベントを正しく処理できません - ドラッグされたアイテムが画面の端近くにあるとき。

どうすればよいですか?

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

アイデアは時にドラッグしたアイテムのトグルエリアでのプログラムで現在のタブを変更することです:私が試した何

しかし、このエリアのイベントDragEvent.ACTION_DRAG_ENTEREDは決して発生しません(私はそう信じているから)GridViewは画面全体を取り、単純にトグルエリアと重なります。

ドラッグ開始イベントが発生したときに、すでにその領域を前面に持ってきてみました。しかし、それは何らかの理由で機能しません。

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

誰でもこのような問題に直面した場合は、あなたの経験を共有してください。それとももっと良い解決法がありますか?私にヒントを与えてください。

+0

私は私の現在のソリューションを掲載しました。しかし、問題に言及されているドラッグ領域を使用することを依然として好みます。ですから誰にでもアイデアがあれば歓迎してください。 – AnZ

+0

を削除してもタブを変更したくない場合は、 –

+0

はい、 'DragEvent.ACTION_DRAG_ENTERED'イベントで現在のタブを変更したいところです – AnZ

答えて

3

私はそれをRelativeLayoutという3つのビュー(トグルエリアとGridView)の親とみなします。まず、GridViewを親の最初の子に置き換えます。残りのレイアウトは、そのままの状態にしておきます。

第2に、View.OnDragListenerインターフェイスのドロップイベントを捕捉するには、AndroidManifest.xmlの最小SDKバージョンを11に設定する必要があります。その後、あなたはトグルエリアにリスナーを渡すことができます場合は、あなたはまだ、問題を抱えているあなたのコードの多くを投稿

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

+0

ドラッグリスナーの設定に問題はありません。私はあなたがここに書いたことを正確に行いました。問題はevent.ACTION_DRAG_ENTEREDは領域を切り替えることがありません。 – AnZ

3

私が現在働く(多かれ少なかれ)解決策は、PagerTabStripタイトルにドラッグエリアとしてTextViewをネストすることです。このアプローチの最大の問題は、トグル領域が何らかの理由で小さすぎることです。 ENTERイベントは、これらの領域でのみトリガされます。

enter image description here

私は、このソリューションは、オールドスクールのタブと良いでしょう信じて。したがってここにコードがあります。誰かにとって役に立つかもしれない。

1)。この操作の後、私はドラッグ&ドロップのナビゲーションを必要とする3 TextViewsを持って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; 
} 

からTextViewsを解析します。

2)。あなたがDragListenersを実装するクラスにTextViewsのリストを渡します。

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

3)。そしてリスナー自体

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; 
    } 
}; 
関連する問題