繁体   English   中英

java.lang.InstantiationException:无法实例化类; 没有空的构造函数

[英]java.lang.InstantiationException: can't instantiate class; no empty constructor

我知道这个错误非常普遍,我也应该添加空的构造函数,例如

public MainActivity(){
super("MainActivity");

但就我而言,它不接受字符串作为参数,因此我真的不知道要传递什么...我将向您展示我的代码,该代码取自Professional Android Development中的Reto Meier示例。

package com.virtualflyer.compass;

import...

public class MainActivity extends View {

    public MainActivity(Context context){
        super(context);
        initCompassView();
    }

    public MainActivity(Context context, AttributeSet attrs){
        super (context, attrs);
        initCompassView();
    }

    public MainActivity(Context context,AttributeSet attrs,int defaultstyle){
        super (context, attrs,defaultstyle);
        initCompassView();
    }

    private Paint markerPaint;
    private Paint textPaint;
    private Paint circlePaint;
    private String northString;
    private String southString;
    private String westString;
    private String eastString;
    private int textHeight;

    protected void initCompassView(){
        setFocusable(true);

        Resources r=this.getResources();

        circlePaint=new Paint (Paint.ANTI_ALIAS_FLAG);
        circlePaint.setColor(r.getColor(R.color.background_color));
        circlePaint.setStrokeWidth(1);
        circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);

        northString=r.getString(R.string.cardinal_north);
        southString=r.getString(R.string.cardinal_south);
        eastString=r.getString(R.string.cardinal_east);
        westString=r.getString(R.string.cardinal_west);

        textPaint= new Paint (Paint.ANTI_ALIAS_FLAG);
        textPaint.setColor(r.getColor(R.color.text_color));

        textHeight=(int)textPaint.measureText("yY");
        markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        markerPaint.setColor(r.getColor(R.color.marker_color));



    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        int measuredWidth=measure(widthMeasureSpec);
        int measuredHeight=measure(heightMeasureSpec);
        int d =Math.min(measuredWidth,measuredHeight);
        setMeasuredDimension(d,d);
    }

    private int measure(int measureSpec){
        int result=0;
        int specMode=MeasureSpec.getMode(measureSpec);
        int specSize=MeasureSpec.getSize(measureSpec);
        if (specMode==MeasureSpec.UNSPECIFIED){
            result=200;
        } else {
            result=specSize;
        }
        return result;
    }

    private float bearing;

    public void setBearing (float _bearing){
        bearing=_bearing;
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
    }

    public float getBearing(){
        return bearing;
    }

    @Override
    public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event){
        super.dispatchPopulateAccessibilityEvent(event);
        if (isShown()){
            String bearingStr= String.valueOf(bearing);
            if (bearingStr.length()>AccessibilityEvent.MAX_TEXT_LENGTH)
                bearingStr=bearingStr.substring(0,AccessibilityEvent.MAX_TEXT_LENGTH);
            event.getText().add(bearingStr);
            return true;
        }
        else{
            return false;
        }

        }


    @Override
    protected void onDraw(Canvas canvas){
        int mMeasuredHeight=getMeasuredHeight();
        int mMeasuredWidth=getMeasuredWidth();
        int px= mMeasuredWidth/2;
        int py=mMeasuredHeight/2;

        int radius=Math.min(px,py);

        canvas.drawCircle(px,py,radius,circlePaint);
        canvas.save();
        canvas.rotate(-bearing,px,py);

        int textWidth=(int)textPaint.measureText("W");
        int cardinalX=px-textWidth/2;
        int cardinalY=py-radius+textHeight;

        for (int i=0; i<24; i++){
            canvas.drawLine(px,py-radius,px,py-radius+10,markerPaint);
            canvas.save();
            canvas.translate(0,textHeight);

            if (i%6==0){
                String dirString ="";
                switch (i){
                    case(0) :{
                        dirString=northString;
                        int arrowY=2*textHeight;
                        canvas.drawLine(px,arrowY,px-5,3*textHeight,markerPaint);
                        break;
                    }
                    case(6) :dirString=eastString;break;
                    case(12) :dirString=southString;break;
                    case(18) :dirString=westString;break;
                }
                canvas.drawText(dirString, cardinalX,cardinalY,textPaint);
            }
            else if (i%3==0){
                String angle =String.valueOf(i*15);
                float angleTextWidth=textPaint.measureText(angle);

                int angleTextX=(int) (px-angleTextWidth/2);
                int angleTextY=(int) py-radius+textHeight;
                canvas.drawText(angle,angleTextX,angleTextY,textPaint);
            }
            canvas.restore();
            canvas.rotate(15,px,py);
        }
        canvas.restore();
    }



}

我不知道您在做什么,但这可能是问题所在:

  1. 为什么要命名“查看活动”扩展的课程? 如果您有MainActivity,则通常需要从Activity类扩展它。

  2. 问题可能在那里,您在清单文件中声明您有一个Activity作为MainActivity,但是您没有这样做,因为您是从View扩展了它。

这是您的工作:

public class MainActivity extends Activity{ ... }
public class MyView extends View { /*insert your View code from above*/ }

在MainActivity中,您可以尝试

setContentView(new MyView(this));

并在AndroidManifest中声明(我猜您在这里或喜欢的都一样)

    <activity
        android:name=".MainActivity"
        android:label="MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM