【问题标题】:Drag and Drop view between two Fragments在两个片段之间拖放视图
【发布时间】:2015-03-26 16:30:10
【问题描述】:

我目前正在尝试在两个片段之间实现拖放。 我已经像这样将它们都添加到了我的活动中

    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 在同一个 View 中,我只想说

        listView.setOnDragListener(new MyDragListener());

但由于我无法访问 ListView,因为它位于不同的 Fragment 中,所以我不知道该怎么做。

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

但我还是想不通。

希望我描述得足够好,在此先感谢!

【问题讨论】:

  • 您能找到解决方案吗?我也面临同样的问题

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


【解决方案1】:

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

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 类型。

【讨论】:

    【解决方案2】:

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

    【讨论】: