调用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 /? I / art:后期启用-Xcheck:jni
重新初始化属性:dalvik.vm.checkjni = false
05-31 21:10:41.351 27902-27909 /? I / art:调试器不再处于活动状态
启动阻塞GC仪器
05-31 21:10:41.425 27902-27902 /? W /系统: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 /? I / art:已释放2801(763KB)AllocSpace对象,0(0B)LOS对象,22%空闲,3MB / 4MB的背景粘性并发标记清除GC已暂停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为空
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 /链接器:/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:尝试从null对象引用上的字段“ boolean com.example.andreas.drawing_exp.CanvasView.colorRed”中读取
在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)
在java.lang.reflect.Method.invoke(本机方法)
在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
最佳答案
在观看了有关如何在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;
}