5

我正在尝试在 android 4+ 中使用内置的拖放功能。为此,我创建了我的自定义 TextView

public class DragSpotTextView extends TextView

textview 拖动工作正常,但是当我在某个拖动点(这也是 textview)上拖动视图时,它给出的异常为;

01-17 16:16:29.178: E/AndroidRuntime(1193): FATAL EXCEPTION: main
01-17 16:16:29.178: E/AndroidRuntime(1193): java.lang.ClassCastException: java.lang.String cannot be cast to android.text.Spannable
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.widget.TextView.onDragEvent(TextView.java:11223)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.View.dispatchDragEvent(View.java:13465)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1104)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:3471)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2620)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.os.Looper.loop(Looper.java:137)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at java.lang.reflect.Method.invokeNative(Native Method)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at java.lang.reflect.Method.invoke(Method.java:511)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-17 16:16:29.178: E/AndroidRuntime(1193):     at dalvik.system.NativeStart.main(Native Method)
4

5 回答 5

5

对于需要它的人来说,这是另一种解决方案。当我将项目拖动到TextView处理拖动事件的地方时,我遇到了同样的问题。显然,导致问题的源代码行位于TextView.onDragEvent()(以下代码中的第三行):

 case DragEvent.ACTION_DRAG_LOCATION:
     final int offset = getOffsetForPosition(event.getX(), event.getY());
     Selection.setSelection((Spannable)mText, offset);
     return true;

对我来说,解决方法是为此消耗我的这种类型的OnDragListener事件TextView

 if (dragEvent.getAction() == DragEvent.ACTION_DRAG_LOCATION) return true;

这是 Android 中的一个错误,当然,这通常不应该发生。

于 2013-10-18T23:04:05.740 回答
1

我有同样的问题。我通过创建自定义TextView并确保自己使用DragEvent.ACTION_DRAG_LOCATION事件并让父类处理其他 Drag 事件来修复它,如下所示:

public class CustomTextView extends TextView {

  @Override
  public boolean onDragEvent(DragEvent event) {
    if(event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
      return true;
    } else {
      return super.onDragEvent(event);
    }
  }

}

希望能帮助到你!

于 2014-08-26T13:11:47.817 回答
0

早些时候,我为 dragListener 使用匿名内联类。现在我改变了它并在类级别实现 OnDragListener。这样我就解决了。

于 2013-01-18T05:34:09.547 回答
0

我有同样的问题。我阅读了这篇文章,然后尝试替换以下代码行:

ClipData data = ClipData.newPlainText("myLabel", "myString");

和:

ClipData data = ClipData.newPlainText("myLabel", ((TextView) v).getText());

显然在 onDragEvent 方法中,第二个参数被强制转换为 Spannable,在使用 String 时会抛出异常。

于 2013-05-18T01:59:25.923 回答
0

对我来说,当我的拖动阴影(不是TextView)进入一个作为 TextView 的放置区,应用程序崩溃了。

在这种情况下,我的解决方案是用 FrameLayout 包装 drop TextView (我愿意打赌任何 *Layout 都可以工作) - 在性能方面不是最优雅的解决方案,但也不是最差的:)

于 2013-05-21T04:27:42.460 回答