线程退出与未捕获的错误:无法实例化类:没有空构造函数

时间:2014-04-03 11:41:55

标签: android

主类:

public class CompassView extends View {

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

    public void setBearing(float _bearing) {
        bearing = _bearing;
    }
    public float getBearing() {
        return bearing;
    }

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

    protected void initCompassView() {
        setFocusable(true);
        circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        Resources r = this.getResources();
        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);
        westString = r.getString(R.string.cardinal_west);
        eastString = r.getString(R.string.cardinal_east);
        southString = r.getString(R.string.cardinal_south);

        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 onDraw(Canvas canvas) {
        int px = getMeasuredWidth() / 2;
        int py = getMeasuredHeight() / 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 = py - radius + textHeight;
                canvas.drawText(angle, angleTextX, angleTextY, textPaint);
            }
            canvas.restore();
            canvas.rotate(15, px, py);
        }

        canvas.restore();
    }

    @
    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.getMode(measureSpec);

        if (specMode == MeasureSpec.UNSPECIFIED) {
            result = 200;
        } else {
            result = specSize;
        }
        return result;
    }
}

活动类:

<LinearLayout 

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.example.compass.CompassView 
android:id="@+id/compassView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

</LinearLayout>

的Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compass"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.compass.CompassView"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

2 个答案:

答案 0 :(得分:1)

CompassViewView,但您已将其声明为清单中的活动。它无法实例化为活动。

相反,在清单中声明您的活动,并让它膨胀包含CompassView的布局。例如,更改

android:name="com.example.compass.CompassView"

android:name="com.example.compass.YourActivityName"

在清单和YourActivityName onCreate()中,

setContentView(R.layout.your_activity_layout);

答案 1 :(得分:0)

在CompassView类中添加默认构造函数

CompassView(){

}