Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当画布视图失效时,点击按钮后应用程序崩溃(Android Studio,Java)_Java_Android_Android Studio_Canvas_View - Fatal编程技术网

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

当画布视图失效时,点击按钮后应用程序崩溃(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

当我调用invalidate刷新视图时,单击按钮后,我的应用程序崩溃。我不明白为什么。如果删除canvasView.invalidate,应用程序不会崩溃。允许从另一个类调用invalidate吗?我是安卓工作室的新手。当然,有人能帮我吗? 编辑:问题解决了,答案如下,我添加了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);
    }
}
日志:

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布局中用作标记。