[英]Android crash on restart app : java.lang.InstantiationException: can't instantiate class ; no empty constructor
[英]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();
}
}
我不知道您在做什么,但这可能是问题所在:
为什么要命名“查看活动”扩展的课程? 如果您有MainActivity,则通常需要从Activity类扩展它。
问题可能在那里,您在清单文件中声明您有一个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.