当我调用invalidate()
刷新视图时,点击按钮后我的应用程序崩溃了。我无法弄清楚原因。如果我删除canvasView.invalidate()
,则该应用不会崩溃。是否允许从另一个班级拨打invalidate()
?我是Android Studio新手。当然,有人可以帮助我吗?
编辑:问题解决了,答案如下,我添加了LogCat。
以下是代码:
public class MainActivity extends AppCompatActivity implements
View.OnClickListener {
CanvasView canvasView;
Button btnChangeColor;
static boolean colorRed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CanvasView canvasView = new CanvasView(this, null);
btnChangeColor = (Button) findViewById(R.id.button);
btnChangeColor.setOnClickListener(this);
colorRed = false;
}
@Override
public void onClick(View v) {
if(colorRed) {
colorRed = false;
canvasView.invalidate();
return;
}
else {
colorRed = true;
canvasView.invalidate();
return;
}
}
}
class CanvasView extends View {
Paint paint;
public CanvasView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(MainActivity.colorRed == true)
paint.setColor(Color.RED);
else
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(400, 400, 50, paint);
}
}
logcat的:
05-31 21:10:41.341 27902-27902 /?我/艺术:延迟启用-Xcheck:jni 重新属性:dalvik.vm.checkjni = false
05-31 21:10:41.351 27902-27909 /?我/艺术:调试器不再有效 启动阻止GC检测
05-31 21:10:41.425 27902-27902 /? W / System:ClassLoader引用未知路径:/data/app/com.example.andreas.drawing_exp-2/lib/arm64
05-31 21:10:41.433 27902-27902 /? I / InstantRun:启动即时运行服务器:是主进程
05-31 21:10:41.450 27902-27902 /? I / HwCust:为类android.app.HwCustActivityImpl找到构造函数
05-31 21:10:41.465 27902-27902 /? I / HwCust:为类android.app.HwCustHwWallpaperManagerImpl找到构造函数
05-31 21:10:41.477 27902-27902 /? W / art:在Android 4.1之前,方法android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter,android.content.res.ColorStateList,android.graphics.PorterDuff $ Mode)会有错误地覆盖了android.graphics.drawable.Drawable
中的package-private方法05-31 21:10:41.533 27902-27913 /?我/艺术:背景粘性并发标记扫描GC释放2801(763KB)AllocSpace对象,0(0B)LOS对象,22%免费,3MB / 4MB,暂停5.329ms总计13.242ms
05-31 21:10:41.567 27902-27902 /? W / VRSystemServiceManager:vr服务不活动
05-31 21:10:41.568 27902-27902 /? I / HwSecImmHelper:mSecurityInputMethodService为null
05-31 21:10:41.571 27902-27902 /? I / HwPointEventFilter:支持AFT
05-31 21:10:41.615 27902-27922 /? I / OpenGLRenderer:初始化的EGL,版本1.4
05-31 21:10:41.621 27902-27922 /? W / linker:/vendor/lib64/libhwuibp.so:未使用的DT条目:类型0xf arg 0xe3a
05-31 21:10:41.629 27902-27902 /? W / art:在Android 4.1之前,方法int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int,boolean)会错误地覆盖android.widget.ListView中的package-private方法
05-31 21:10:48.728 27902-27902 / com.example.andreas.drawing_exp I / hwaps:JNI_OnLoad
05-31 21:10:48.802 27902-27902 / com.example.andreas.drawing_exp E / AndroidRuntime:FATAL EXCEPTION:main 处理:com.example.andreas.drawing_exp,PID:27902 java.lang.NullPointerException:尝试从字段中读取' boolean com.example.andreas.drawing_exp.CanvasView.colorRed'在null对象引用上 在com.example.andreas.drawing_exp.MainActivity.onClick(MainActivity.java:37) 在android.view.View.performClick(View.java:5646) 在android.view.View $ PerformClick.run(View.java:22473) 在android.os.Handler.handleCallback(Handler.java:761) 在android.os.Handler.dispatchMessage(Handler.java:98) 在android.os.Looper.loop(Looper.java:156) 在android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:942) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
05-31 21:10:48.837 27902-27902 / com.example.andreas.drawing_exp I / Process:发送信号。 PID:27902 SIG:9
答案 0 :(得分:1)
我发现了为什么我的应用在观看了一些关于如何在YouTube中自定义视图中绘制的教程后崩溃了。 这是因为我以错误的方式初始化了我的画布视图类。我没有为视图添加ID,也没有使用'findViewById'进行初始化,而是使用了类的构造函数。但无论如何,谢谢你的回答! 以下是更改后的代码的样子(原始代码的简短摘录):
public class MainActivity extends AppCompatActivity implements
View.OnClickListener{
CanvasView canvasView;
Button btnChangeColor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
canvasView = (CanvasView) findViewById(R.id.canvasview);
btnChangeColor = (Button) findViewById(R.id.button);
btnChangeColor.setOnClickListener(this);
canvasView.colorRed = false;
}
答案 1 :(得分:0)
您错误地使用了invalidate()
。
必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()
。
您使用postInvalidate()
执行此操作。