有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无虚拟方法startDragAndDrop

我正在学习https://www.youtube.com/watch?v=L-bndS0Z4r8教程,但遇到了这个错误。请帮忙

主要活动。爪哇

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    findViewById(R.id.textView).setOnLongClickListener(longListen);
    findViewById(R.id.textView2).setOnLongClickListener(longListen);
    findViewById(R.id.textView3).setOnLongClickListener(longListen);
}
View.OnLongClickListener longListen = new View.OnLongClickListener() {
    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public boolean onLongClick(View v) {
        DragShadow dragShadow = new DragShadow(v);

        ClipData data = ClipData.newPlainText("",  "");
            v.startDragAndDrop(data,dragShadow,v,0);

        return false;
    }
};

private class DragShadow extends View.DragShadowBuilder{

    ColorDrawable grayBox;

    DragShadow(View view) {
        super(view);
        grayBox = new ColorDrawable(Color.LTGRAY);
    }

    @Override
    public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) {
        super.onProvideShadowMetrics(outShadowSize,outShadowTouchPoint);
       View v =getView();

        int h = v.getHeight()/2;
        int w = v.getWidth()/2;

        grayBox.setBounds(0,0,w,h);

        outShadowSize.set(w,h);

        outShadowTouchPoint.set(w/2,h/2);
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        super.onDrawShadow(canvas);
       grayBox.draw(canvas);

    }
}

主要活动。xml

<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"

xmlns:tools="http://schemas.安卓.com/tools"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:weightSum="1"
安卓:orientation="vertical"
安卓:baselineAligned="false">


<TextView
    安卓:text="Test 1"
    安卓:layout_width="wrap_content"
    安卓:layout_height="0dp"
    安卓:id="@+id/textView"
    安卓:layout_gravity="center"
    安卓:layout_weight="0.25" />

<TextView
    安卓:text="Test2"
    安卓:layout_width="wrap_content"
    安卓:layout_height="0dp"
    安卓:id="@+id/textView2"
    安卓:layout_gravity="center"
    安卓:layout_weight="0.25" />

<TextView
    安卓:text="Test3"
    安卓:layout_width="wrap_content"
    安卓:layout_height="0dp"
    安卓:id="@+id/textView3"
    安卓:layout_gravity="center"
    安卓:layout_weight="0.25" />

<TextView
    安卓:text="Drop target"
    安卓:layout_width="wrap_content"
    安卓:layout_height="0dp"
    安卓:id="@+id/textView4"
    安卓:layout_gravity="center"
    安卓:layout_weight="0.25" />

错误

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.moon.draganddrop, PID: 3077
              java.lang.NoSuchMethodError: No virtual method startDragAndDrop(L安卓/content/ClipData;L安卓/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z in class L安卓/view/View; or its super classes (declaration of '安卓.view.View' appears in /system/framework/framework.jar:classes2.dex)
                  at com.example.moon.draganddrop.MainActivity$1.onLongClick(MainActivity.java:41)
                  at 安卓.view.View.performLongClick(View.java:5237)
                  at 安卓.widget.TextView.performLongClick(TextView.java:9228)
                  at 安卓.view.View$CheckForLongPress.run(View.java:21121)
                  at 安卓.os.Handler.handleCallback(Handler.java:739)
                  at 安卓.os.Handler.dispatchMessage(Handler.java:95)
                  at 安卓.os.Looper.loop(Looper.java:148)
                  at 安卓.app.ActivityThread.main(ActivityThread.java:5417)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:616)

基本上我想创建一个拖放应用程序。这个过程是当点击textview并将其移动到drop目标时,它会触发一些事情,例如更改背景颜色。但我仍然被这个问题困扰着。请帮忙。我真是个笨蛋


共 (2) 个答案

  1. # 1 楼答案

    startDrag()代替startDragAndDrop()。它被标记为已弃用,但与startDragAndDrop()不同,它可以工作。这可能与API版本有关

  2. # 2 楼答案

    问题在于您试图利用的设备API的当前版本。StartDragAndDrop方法仅适用于API版本24或Nougat(android 7.0)以上版本。要解决这个问题,您应该添加:

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
       v.startDragAndDrop(data,dragShadow,v,0);
    } else {
       v.startDrag(data,dragShadow,v,0);
    }