我目前正在尝试在两个片段之间实现拖放。 我已将它们添加到我的活动中,如此
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
但我仍然无法弄清楚。
希望我能够很好地描述它,提前谢谢!
答案 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方法,然后将此方法设置为要接受删除视图的视图(片段视图)