【问题标题】:Dragging a TextView into an EditText将 TextView 拖入 EditText
【发布时间】:2013-12-03 20:12:14
【问题描述】:

我是 android 编程新手,我正在尝试将 textview 拖到 edittext 中。

我创建了一个 OnTouchListener,它在 textview 中选择文本并将其存储为 ClipData。

OnTouchListener:

item.setOnTouchListener(new OnTouchListener(){

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        ClipData data = ClipData.newPlainText("text", str);
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);

    }
        return true;    
  }

});

然后我想将此数据附加到 EditText 视图中。为此,我为 EditText 实现了一个 OnDragListener

OnDragListener:

    TextStage.setOnDragListener(new OnDragListener(){

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch(event.getAction())
            {
                case DragEvent.ACTION_DRAG_STARTED: break;
                case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                            CharSequence paste = item.getText();
                                            v.append(paste.toString());                                         
                                            break;
                case DragEvent.ACTION_DRAG_ENDED: break;
                case DragEvent.ACTION_DRAG_EXITED: break;
                default: break;
            }

            return false;
        }

    });

问题:

当我完成拖动时,文本视图的两个实例被附加到编辑文本中。

例子:

TextView 中的字符串:“我要拖动这个”

放入EditText后:“我要拖这个我要拖这个”

我不明白为什么应该有两个drop,因为我已经为edittext覆盖了onDrag。 我还处理了所有 DragEvent 操作。

编辑:查看日志后,即使删除 DragListener 后我也会看到此消息

11-20 07:30:04.885: I/ViewRootImpl(3518): Reporting drop result: true

了解 ViewRootImpl 可能是什么?

【问题讨论】:

    标签: android drag-and-drop


    【解决方案1】:

    它会发生,因为它会重复拖动,因此您可以避免这种情况,例如: 像这样附加文本:

    从拖拽类中创建布尔变量isDropping=false;

    当你开始拖动时使isDropping=true;

    在 Drop 中:

    case DragEvent.ACTION_DROP: 
    ClipData.Item item = event.getClipData().getItemAt(0); 
    CharSequence paste = item.getText();
    if(isDropping){
    v.append(paste.toString());
    isDropping=false;
    } break;
    

    【讨论】:

    • 感谢您的建议,我刚刚尝试过,但似乎发生了两个不同的事件。 1. OnDrag(我修改字符串的地方) 2. 未知(文本完全复制为 ClipData)
    【解决方案2】:

    我已经使用了你的代码并检查了它,

    我知道如果不实现 Draglistner 它可以正常工作,因此只需从您的项目中删除下面的整个代码就可以正常工作。

     TextStage.setOnDragListener(new OnDragListener(){
    
        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch(event.getAction())
            {
                case DragEvent.ACTION_DRAG_STARTED: break;
                case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                            CharSequence paste = item.getText();
                                            v.append(paste.toString());                                         
                                            break;
                case DragEvent.ACTION_DRAG_ENDED: break;
                case DragEvent.ACTION_DRAG_EXITED: break;
                default: break;
            }
    
            return false;
        }
    
    });
    

    【讨论】:

    • 它可以工作,但我也想修改放置时的文本。如果我只是删除 on drag 监听器,我无法添加额外的功能。感谢您的回答
    【解决方案3】:

    我意识到将要删除的文本的 MIME_TYPE 从纯文本更改为 html 解决了这样的问题:

    ClipData data = ClipData.newPlainText("text", str);
    

    ClipData data = ClipData.newHtmlText("text", str,"");
    

    这样,编辑文本将剪辑数据视为html,并不会自动进行拖动操作。谢谢大家的回答

    【讨论】:

      【解决方案4】:

      你错过了返回值

      TextStage.setOnDragListener(new OnDragListener(){
      
              @Override
              public boolean onDrag(View v, DragEvent event) {
                  switch(event.getAction())
                  {
                      case DragEvent.ACTION_DRAG_STARTED: break;
                      case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                                  CharSequence paste = item.getText();
                                                  v.append(paste.toString());                                         
                                                  break;
                      case DragEvent.ACTION_DRAG_ENDED: break;
                      case DragEvent.ACTION_DRAG_EXITED: break;
                      default: break;
                  }
      //return true working perfect
                  return true;
              }
      
          });
      

      htmltext 仅适用于 16 API 以上...

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        相关资源
        最近更新 更多