我试图在用户开始拖动时立即显示(或添加)目标。
该文档解释说,收到onDrag
后,应在ACTION_DRAG_STARTED
处理此问题,然后可以将其用于强调View
能够接受拖动。
但是,我的视图(实际上是LinearLayout
)在没有拖动时应该看起来不同,并且在启动拖动时显示放置目标。
正常看:
[Item A][Item B]
当拖动开始时,它应该如下所示:
[ ][Item A][ ][Item B][ ]
其中空括号表示可以删除拖动的位置。
我已尝试以下方法来实现这一目标:
1)动态添加视图
当顶级容器收到ACTION_DRAG_STARTED
时,动态添加放置目标视图。问题:新添加的视图从不接收ACTION_DRAG_STARTED
本身(或任何其他事件),因此他们无法接受丢弃。
2)隐藏掉落目标
始终在可用的实际项目之间放置View.GONE
个放置目标,并在拖动开始时将它们设为View.VISIBLE
:
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED) {
// Make all containers visible:
for(int i = 0; i < cc.getChildCount(); i++) {
cc.getChildAt(i).setVisibility(View.VISIBLE);
}
}
问题:显然View.GONE
也意味着视图不会收到事件。与View.INVISIBLE
相同。
那么,我的选择是什么?使用说View.VISIBLE
并在拖动开始/结束时进行一些动态调整大小?看起来真傻......
有更好的建议吗?
答案 0 :(得分:1)
您需要在致电startDrag()
或startDragAndDrop()
之前更改可见性。我在this sample app(来自this chapter this book,FWIW)中证明了这一点。
在该示例中,如果您在平板电脑上运行它,我将通过长按RecyclerView
中的项目来启动拖放操作:
@Override
public boolean onLongClick(View v) {
if (listener!=null) {
listener.onStartDrag();
}
ClipData clip=ClipData.newRawUri(title.getText(), videoUri);
View.DragShadowBuilder shadow=new View.DragShadowBuilder(thumbnail);
itemView.startDrag(clip, shadow, Boolean.TRUE, 0);
return(true);
}
但在我致电startDrag()
之前,我让一位注册的听众知道我即将开始拖拽。该监听器是托管活动,它使我的“热点”放置目标可见:
@Override
public void onStartDrag() {
info.setVisibility(View.VISIBLE);
}
净效果类似于主屏幕,当您开始拖动时,会出现特定的“操作”(例如,卸载)。
我最初尝试了你的第二种方法,但它没有用。我的假设是调用startDrag()
或startDragAndDrop()
基本上捕获了可见丢弃目标的名单,因此对该名单(新小部件,新显示的小部件)的更改在此之后无效。