Java 开始拖动时显示拖放目标

Java 开始拖动时显示拖放目标,java,android,drag-and-drop,Java,Android,Drag And Drop,我试图在用户开始拖动时,使拖放目标可见(或添加它们) 文档说明,当收到操作拖动开始时,应在onDrag中处理此问题,然后可以使用此操作来表示突出显示视图,使其能够接受拖动 但是,我的视图(实际上是一个线性布局)在没有进行拖动时看起来应该不同,并且在开始拖动时显示放置目标 正常外观: [Item A][Item B] 当拖动开始时,它应该如下所示: [ ][Item A][ ][Item B][ ] 其中,空括号表示可以拖放的位置 为了实现这一目标,我尝试了以下方法: 1)动态添加视图 当顶级

我试图在用户开始拖动时,使拖放目标可见(或添加它们)

文档说明,当收到
操作拖动开始时,应在
onDrag
中处理此问题,然后可以使用此操作来表示突出显示
视图,使其能够接受拖动

但是,我的视图(实际上是一个
线性布局
)在没有进行拖动时看起来应该不同,并且在开始拖动时显示放置目标

正常外观:

[Item A][Item B]
当拖动开始时,它应该如下所示:

[ ][Item A][ ][Item B][ ]
其中,空括号表示可以拖放的位置

为了实现这一目标,我尝试了以下方法:

1)动态添加视图

当顶级容器接收到
操作\u拖动\u启动时
,动态添加拖放目标视图。问题:新添加的视图本身(或任何其他事件)从未接收到
操作\u拖放\u启动,因此它们无法接受拖放

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);
      }
    }
if(event.getAction()==DragEvent.ACTION\u DRAG\u启动){
//使所有容器可见:
对于(int i=0;i
问题:显然
View。GONE
也意味着视图不接收事件。与
视图相同。不可见

那么,我的选择是什么?当拖动开始/结束时,使用“查看可见”和“动态调整大小”?看起来真的很傻


有更好的建议吗?

您需要在调用
startDrag()
startdragandrop()
之前更改可见性。我在(从of,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()
startdragandrop()
基本上可以捕获可见放置目标的列表,因此对该列表的更改(新小部件,新可见小部件)在这一点之后没有效果。

您可以在拖动侦听器的同时动态添加视图这里是一个示例,但使用onClick Listener尝试将其更改为onDrag Lister