Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 实现将项目拖动到屏幕边缘功能_Android_Android Layout_Drag And Drop_Android Viewpager - Fatal编程技术网

Android 实现将项目拖动到屏幕边缘功能

Android 实现将项目拖动到屏幕边缘功能,android,android-layout,drag-and-drop,android-viewpager,Android,Android Layout,Drag And Drop,Android Viewpager,当项目被拖动到屏幕边缘(左侧或右侧)附近时,我需要实现当前选项卡更改 拖放功能和当前选项卡开关没有问题。我就是不能正确处理这个事件——当拖动的项目靠近屏幕边缘时 你会怎么做? 我尝试的是: <FrameLayout android:id="@+id/left_toggle_area" android:layout_width="30dp" android:layout_height="fill_parent" android:layout_alignPare

当项目被拖动到屏幕边缘(左侧或右侧)附近时,我需要实现当前选项卡更改

拖放功能和当前选项卡开关没有问题。我就是不能正确处理这个事件——当拖动的项目靠近屏幕边缘时

你会怎么做?

我尝试的是:

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

如果有人面临这样的问题,请分享你的经验。或许还有更好的解决办法。请给我一个提示。

我认为这三个视图(切换区域和
GridView
)的父视图是一个
相对视图。首先,将
GridView
替换为其父级的第一个子级。让布局的其余部分保持原样

其次,为了使用
View.OnDragListener
接口捕获drop事件,您需要在
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);

如果仍然存在问题,请发布更多代码。

我找到的当前解决方案(或多或少)是使用
TextView
嵌套在
PagerTabStrip
标题中作为拖动区域。这种方法最大的缺点是,由于某些原因,这些切换区域太小。仅在这些区域输入事件触发器

我相信这个解决方案会很好地与老学校标签。因此,这里是代码。可能对某人有用

1) 。从
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;
}
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;
    }
};

拖动侦听器的设置没有问题。我完全按照你在这里写的做了。问题是,在切换区域中,输入的event.ACTION\u DRAG\u从未出现过。我发布了当前的解决方案。但仍然更喜欢使用问题中提到的阻力区域。因此,如果有人有想法,请欢迎。那么你不想放弃并仍然更改选项卡吗?是的,我想用
DragEvent.ACTION\u DRAG\u输入
event更改当前选项卡。你想拖动哪个项目以及它的位置?现在知道了……尝试使用带有视图标记的空视图容器,而不是framelayout。
 public void setUpDragNDropTabMoves(ArrayList<TextView> views) {
    if (views != null) {
        for (TextView tv : views){
            tv.setOnDragListener(TabToggleDragListener);
        }
    }
 }
 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;
    }
};