没有可调试错误的 ClassCastException

问题描述

我正在尝试在 drawline(activity) 中创建一个指状线(class) 对象。指状线采用 MainActivity(activity) 的上下文。我得到 ClassCastException 表明这一点

    Process: com.example.caddrawingtool,PID: 11405
    java.lang.RuntimeException: Unable to instantiate application 
    com.example.caddrawingtool.MainActivity: java.lang.classCastException: 
    com.example.caddrawingtool.MainActivity cannot be cast to android.app.Application
    at android.app.LoadedApk.makeApplication(LoadedApk.java:1226)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6504)
    at android.app.ActivityThread.access$1400(ActivityThread.java:229)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1892)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7436)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)

我已将绘制线中的 getApplicationContext() 更改为使用

  this    

我无法使用

        MainActivity.this

虽然。

有没有办法简化这一切? 我的主活动代码

    public class MainActivity extends AppCompatActivity {
fingerline dv;
private Paint mpaint;
private Context context;
MainActivity MainActivity(){
    return MainActivity.this;

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    dv = new fingerline(this);
    setContentView(dv);
   
    dv.setBackgroundColor(Color.BLACK);
    mpaint = new Paint();
    mpaint.setAntiAlias(true);
    mpaint.setDither(true);
    mpaint.setColor(Color.WHITE);
    mpaint.setStyle(Paint.Style.stroke);
    mpaint.setstrokeJoin(Paint.Join.MITER);
    mpaint.setstrokeCap(Paint.Cap.ROUND);
    mpaint.setstrokeWidth(12);
    getSupportActionBar().setTitle("3D TOOL");
    getSupportActionBar().setdisplayHomeAsUpEnabled(true);
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu,menu);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onoptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.line:
            Intent intent = new Intent(this,drawline2.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            this.startActivity(intent);

            break;
        case R.id.circle:
            Intent intent1=new Intent(this,drawcircle.class);
            intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            this.startActivity(intent1);

            break;
        case R.id.rectangle:
            Intent intent2=new Intent(this,drawrectangle.class);
            intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            this.startActivity(intent2);
            break;
        case R.id.offset:

            break;
        default:
            break;

    }
    return super.onoptionsItemSelected(item);

}

我的指纹代码

  public class fingerline extends View {
public int width,height;
private Bitmap mbitmap;
private Canvas mcanvas;
private Paint mpaint,mbitmappaint,circlepaint;
private float startx;
private float starty;
private float endx;
private float endy;
private Path path,circlepath;
Context c;

public fingerline(Context context) {
    super(context);
  //  c = context;
    path = new Path();
    mpaint = new Paint();
    mbitmappaint = new Paint(Paint.DITHER_FLAG);
    circlepaint = new Paint();
    circlepath = new Path();
    circlepaint.setAntiAlias(true);
    circlepaint.setColor(Color.WHITE);
    circlepaint.setStyle(Paint.Style.stroke);
    circlepaint.setstrokeJoin(Paint.Join.MITER);
    circlepaint.setstrokeWidth(4f);
}

@Override
protected void onSizeChanged(int w,int h,int oldw,int oldh) {
    super.onSizeChanged(w,h,oldw,oldh);
    mbitmap = Bitmap.createBitmap(w,Bitmap.Config.ARGB_8888);
    mcanvas = new Canvas(mbitmap);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mpaint.setStyle(Paint.Style.stroke);
    mpaint.setColor(Color.WHITE);
    mpaint.setstrokeWidth(12);
    mpaint.setAntiAlias(true);
    mpaint.setDither(true);
    mpaint.setstrokeJoin(Paint.Join.MITER);
    mpaint.setstrokeCap(Paint.Cap.ROUND);
    canvas.drawBitmap(mbitmap,mbitmappaint);
    canvas.drawPath(path,mpaint);
    canvas.drawPath(circlepath,circlepaint);
}

private float mX,mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x,float y) {
    path.reset();
    path.moveto(x,y);
    mX = x;
    mY = y;
}

private void touch_move(float x,float y) {
    float dX = Math.abs(x - mX);
    float dY = Math.abs(y - mY);
    if (dX >= TOUCH_TOLERANCE) {
        path.quadTo(mX,mY,(x + mX) / 2,(y + mY) / 2);
        mX = x;
        mY = y;
    }
}

private void touch_up() {
    path.lineto(mX,mY);
    circlepath.reset();
    mcanvas.drawPath(path,mpaint);
    path.reset();
}

@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            startx = event.getX();
            starty = event.getY();
            touch_start(startx,starty);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            startx = event.getX();
            starty = event.getY();
            touch_move(startx,starty);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;

    }
    return true;

}

}

我的画线代码

public class drawline2 extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawline2);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    EditText editText,editText1;
    editText = (EditText) findViewById(R.id.length);
    editText1 = (EditText) findViewById(R.id.angle);
    Canvas canvas;
    Paint paint = new Paint();
    Paint circlepaint = new Paint();
    Path path = new Path();
    Path cpath = new Path();
    circlepaint.setAntiAlias(true);
    circlepaint.setstrokeWidth(4f);
    circlepaint.setColor(Color.WHITE);
    circlepaint.setStyle(Paint.Style.stroke);
    circlepaint.setstrokeJoin(Paint.Join.MITER);
    fingerline dv;
    dv = new fingerline(this);
    dv.setBackgroundColor(Color.BLACK);
    setContentView(dv);
    circlepaint.setAntiAlias(true);
    circlepaint.setDither(true);
    String value = editText.getText().toString();
    int length =0;
    double angle=0;
    if(value!=null && value.length()>0){
        try{
            length = Integer.parseInt(value);

        }
        catch (NullPointerException e){
            length=0;
        }
    }

    String value1 = editText1.getText().toString();
    if(value1!=null && value1.length()>0){
        try{
            angle = Double.parseDouble(value1);
        }
        catch (NullPointerException e){
            angle=0;
        }
    }


    int startX,startY,endX,endY,x,y;
    x= 0;
    y=0;
    path.reset();
    path.moveto(x,y);
    startX = (int) x;
    startY = (int) y;

    endY = (int) (x + length * Math.cos(angle));
    endX = (int) (x + length * Math.sin(angle));


    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG)
                    .setAction("Action",null).show();

        }

    });
}

} 提前致谢。

解决方法

简而言之:

MainActivity 无法转换为 android.app.Application

您可以通过将其命名为 DrawlineActivityFingerlineActivity 使其更具可读性。然后只需使用 thisDrawlineActivity.this 作为 Context