当项目被拖动到屏幕边缘(左或右)附近时,我需要实现当前选项卡更改。
拖放功能和当前选项卡切换没有问题。我只是无法正确处理此事件 - 当拖动的项目靠近屏幕边缘时。
你会怎么做?
我尝试过的:
<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();
如果有人遇到此类问题,请分享您的经验。或者也许还有另一个更好的解决方案。请给我一个提示。
最佳答案
我找到的当前解决方案(或多或少)是使用嵌套在 PagerTabStrip
标题中的 TextView
作为拖动区域。这种方法最大的缺点是那些切换区域由于某种原因太小了。 ENTER 事件仅在这些区域触发。
我相信这个解决方案适用于老派标签。因此这里的代码。可能对某人有用。
1).从 PagerTabStrip
TextViews
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;
}
此操作后,我有 3 个需要拖放导航的 TextView。
2).将您的 TextViews
列表传递给您实现 DragListeners
的类:
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;
}
};
关于android - 实现拖动项目到屏幕边缘功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34357896/