调用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;

    }

10-08 19:15