android-studio - 为什么我拖动元素时我的应用程序崩溃?
问题描述
我正在尝试制作一个应用程序,您可以在其中拖放特定元素并创建自己的 UI。但是,当我握住该元素并尝试拖动它时,应用程序崩溃了。错误发生在第 59 行:v.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
,我试图将滤色器设置为正在拖动的当前视图的背景。
代码:
package com.app.dragndrop;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.app.dragndrop.R;
public class MainActivity extends AppCompatActivity implements View.OnDragListener, View.OnLongClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView myText = findViewById(R.id.myText);
myText.setOnLongClickListener(this);
myText.setOnDragListener(this);
}
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData data = new ClipData(v.getTag().toString(), mimeTypes, item);
View.DragShadowBuilder dragshadow = new View.DragShadowBuilder(v);
v.startDrag(data
, dragshadow
, v
, 0
);
return true;
}
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
return true;
}
return false;
case DragEvent.ACTION_DRAG_ENTERED:
v.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
v.invalidate();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DRAG_EXITED:
v.getBackground().clearColorFilter();
v.invalidate();
return true;
case DragEvent.ACTION_DROP:
ClipData.Item item = event.getClipData().getItemAt(0);
String dragData = item.getText().toString();
Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_SHORT).show();
v.getBackground().clearColorFilter();
v.invalidate();
View vw = (View) event.getLocalState();
ViewGroup owner = (ViewGroup) vw.getParent();
owner.removeView(vw);
LinearLayout container = (LinearLayout) v;
container.addView(vw);
vw.setVisibility(View.VISIBLE);
return true;
case DragEvent.ACTION_DRAG_ENDED:
v.getBackground().clearColorFilter();
v.invalidate();
if (event.getResult())
Toast.makeText(this, "The drop was handled.", Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_SHORT).show();
return true;
default:
Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
break;
}
return false;
}
}
错误:
2020-07-21 15:08:15.596 4515-4515/com.app.dragndrop E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.dragndrop, PID: 4515
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setColorFilter(int, android.graphics.PorterDuff$Mode)' on a null object reference
at com.app.dragndrop.MainActivity.onDrag(MainActivity.java:59)
at android.view.View.callDragEventHandler(View.java:24446)
at android.view.ViewRootImpl.setDragFocus(ViewRootImpl.java:6678)
at android.view.View.dispatchDragEvent(View.java:24435)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewGroup.dispatchDragEvent(ViewGroup.java:1759)
at android.view.ViewRootImpl.handleDragEvent(ViewRootImpl.java:6557)
at android.view.ViewRootImpl.access$1100(ViewRootImpl.java:141)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4422)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:235)
at android.app.ActivityThread.main(ActivityThread.java:6760)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
谢谢您的帮助!
解决方案
推荐阅读
- listview - 使用 listview.separated 时在列表中重复相同的项目
- java - 在java中20天后删除文件
- android - 不带抬头视图的通知
- reactjs - 反应导航不会转到其他屏幕
- android - 应用程序终止时未在通知点击时打开特定视图
- jquery - Jquery添加图像属性修复
- ios - 如何使用 UISlider 在 UIScrollView 中进行放大、缩小?
- angular - 基于 MatDatePicker 的自定义日期选择器 - 打开选择器和焦点输入
- matrix - 具有水平嵌套组标题设置的矩阵
- javascript - 从 data() 调用方法