当画布视图无效时按钮单击后应用程序崩溃(Android Studio,Java)

时间:2018-05-31 01:59:53

标签: java android android-studio canvas view

当我调用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

2 个答案:

答案 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()执行此操作。