在两个片段之间拖放视图

时间:2015-03-26 16:30:10

标签: android android-fragments drag-and-drop

我目前正在尝试在两个片段之间实现拖放。 我已将它们添加到我的活动中,如此

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.leftContainer, new MainActivityFragment());
    ft.add(R.id.rightContainer, new CartFragment());
    ft.commit();

我的MainActivityFragment中有几个CardView。我想将它们拖到我的CartFragment中的ListView中。然后我在删除CardView后向这个ListView添加一个新项目。

到目前为止,我已在MainActivityFragment中添加了此代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View currentView = inflater.inflate(R.layout.fragment_main, container, false);

    firstProduct = (LinearLayout) currentView.findViewById(R.id.firstProduct);

    firstProduct.setOnTouchListener(new MyTouchListener());

    return currentView;
}

private final class MyTouchListener implements View.OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            return true;
        } else {
            return false;
        }
    }
}

class MyDragListener implements View.OnDragListener {
    Drawable enterShape = getResources().getDrawable(R.drawable.drag_overlay);

    @Override
    public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                // do nothing
                v.setBackgroundDrawable(enterShape);

                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                break;
            case DragEvent.ACTION_DROP:
                // Dropped, reassign View to ViewGroup
                View view = (View) event.getLocalState();

                view.setVisibility(View.VISIBLE);
                break;
            case DragEvent.ACTION_DRAG_ENDED:
            default:
                break;
        }
        return true;
    }
}

如果我要拖动的CardView和我想要放下它的ListView将在同一个视图中,我只是说

        listView.setOnDragListener(new MyDragListener());

但由于我无法访问ListView,因为它位于不同的片段中,我不知道如何执行此操作。

我已经看过这个帖子drag-and-drop-between-two-fragments

但我仍然无法弄清楚。

希望我能够很好地描述它,提前谢谢!

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并找到了一种使用抽象类实现它的好方法。 你可以写你的抽象类:

public abstract class SomeFragment extends Fragment{
    //add your touch and drag listeners here
}

然后让你的两个最初扩展Fragment的类扩展你的抽象类:

public class MainActivityFragment extends SomeFragment{

}

由于您的侦听器是在抽象类中定义的,因此允许这些分配:

public class CartFragment extends SomeFragment{
    listView.setOnDragListener(new MyDragListener());
}

而且,像CartFragment这样的子类仍然是Fragment类型,因为SomeFragment属于Fragment类型。

答案 1 :(得分:0)

必须在将接受DragEvent.Action_Drop情况的片段内实现onDrag方法,然后将此方法设置为要接受删除视图的视图(片段视图)