当画布视图失效时,点击按钮后应用程序崩溃(Android Studio,Java)
当我调用invalidate刷新视图时,单击按钮后,我的应用程序崩溃。我不明白为什么。如果删除canvasView.invalidate,应用程序不会崩溃。允许从另一个类调用invalidate吗?我是安卓工作室的新手。当然,有人能帮我吗? 编辑:问题解决了,答案如下,我添加了LogCat 代码如下:当画布视图失效时,点击按钮后应用程序崩溃(Android Studio,Java),java,android,android-studio,canvas,view,Java,Android,Android Studio,Canvas,View,当我调用invalidate刷新视图时,单击按钮后,我的应用程序崩溃。我不明白为什么。如果删除canvasView.invalidate,应用程序不会崩溃。允许从另一个类调用invalidate吗?我是安卓工作室的新手。当然,有人能帮我吗? 编辑:问题解决了,答案如下,我添加了LogCat 代码如下: public class MainActivity extends AppCompatActivity implements View.OnClickListener { Canvas
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);
}
}
日志:
05-31 21:10:41.341 27902-27902/?I/art:Late-enabling-Xcheck:jni
Reinit属性:dalvik.vm.checkjni=false
05-31 21:10:41.351 27902-27909/?I/art:调试器不再处于活动状态
启动阻塞GC检测
05-31 21:10:41.425 27902-27902/?W/System:ClassLoader引用了未知路径:/data/app/com.example.andreas.drawing\u 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.hwcusthwWallperManagerImpl找到构造函数
05-31 21:10:41.477 27902-27902/?W/art:Android 4.1之前的方法Android.graphics.PorterDuffColorFilter Android.support.graphics.drawable.VectorDrawableCompat.UpdatentFilterAndroid.graphics.PorterDuffColorFilter,Android.content.res.ColorStateList,android.graphics.PorterDuff$模式会错误地覆盖android.graphics.drawable.drawable中的包私有方法
05-31 21:10:41.53327902-27913/?I/art:背景粘性并发标记扫描GC释放2801763KB AllocSpace对象,00B LOS对象,22%空闲,3MB/4MB,暂停5.329ms总计13.242ms
05-31 21:10:41.567 27902-27902/?W/VRSystemServiceManager:虚拟现实服务未激活
05-31 21:10:41.568 27902-27902/?I/HwSecImmHelper:mSecurityInputMethodService为空
05-31 21:10:41.571 27902-27902/?I/HwPointEventFilter:后置支架
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.lookForSelectablePositionint,boolean会错误地覆盖Android.widget.ListView中的包私有方法
05-31 21:10:48.728 27902-27902/com.example.andreas.drawing\u exp I/hwaps:JNI\u OnLoad
05-31 21:10:48.802 27902-27902/com.example.andreas.drawing_exp E/AndroidRuntime:致命异常:main
流程:com.example.andreas.drawing_exp,PID:27902
java.lang.NullPointerException:尝试读取空对象引用上的“boolean com.example.andreas.drawing_exp.CanvasView.colorRed”字段
在com.example.andreas.drawing\u exp.MainActivity.onClickMainActivity.java:37
在android.view.view.performClickView.java:5646
在android.view.view$PerformClick.runView.java:22473
位于android.os.Handler.handleCallbackHandler.java:761
在android.os.Handler.dispatchMessageHandler.java:98
在android.os.Looper.Looper.java:156
在android.app.ActivityThread.mainActivityThread.java:6523
在java.lang.reflect.Method.Invokenactive方法中
位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:942
位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:832
05-31 21:10:48.837 27902-27902/com.example.andreas.drawing\u exp I/过程:发送信号。PID:27902 SIG:9您正在错误地使用无效
这必须从UI线程调用。要从非UI线程调用,请调用postInvalidate
您可以使用postInvalidate来完成此操作。在YouTube上观看了一些关于如何在自定义视图中绘制的教程后,我发现了我的应用程序崩溃的原因。 这是因为我以错误的方式初始化了canvas view类。我没有为视图添加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;
}
请发布日志或阅读有关如何查找错误源的提示。由于颜色与画布的关系大于活动,因此colorRed变量应位于CanvasView类中。使用static在类之间共享变量是对static的不当使用。可能会重复使用。感谢您的提示。我找到了我的应用程序崩溃的原因。如果您感兴趣,请参阅下面我的答案。即使我调用canvasView.postInvalidate,应用程序也会崩溃。什么是UI线程?请注意,所有事件处理程序都在UI线程上运行,包括OP中的onClick方法,该类将失效。请注意,使用构造函数创建自定义视图没有什么错。但是,您还需要将新视图添加到act中 用户的视图层次结构。在这里使用您的解决方案要简单得多,假设CanvasView在XML布局中用作标记。