【问题标题】:No empty constructor can't initiate class没有空的构造函数不能启动类
【发布时间】:2014-03-20 00:18:26
【问题描述】:

我已经尝试在我的手机中运行并编译这段代码:

public class SingleTouchEventView extends View {
  private Paint paint = new Paint();
  private Path path = new Path();

  public SingleTouchEventView(Context context, AttributeSet attrs) {
    super(context, attrs);

    paint.setAntiAlias(true);
    paint.setStrokeWidth(6f);
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    canvas.drawPath(path, paint);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    float eventX = event.getX();
    float eventY = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      path.moveTo(eventX, eventY);
      return true;
    case MotionEvent.ACTION_MOVE:
      path.lineTo(eventX, eventY);
      break;
    case MotionEvent.ACTION_UP:
      // nothing to do
      break;
    default:
      return false;
    }

    // Schedules a repaint.
    invalidate();
    return true;
  }
} 

但它崩溃了,我的 logcat 说以下内容:

无法启动类......没有空的构造函数

任何线索我做错了什么?

【问题讨论】:

  • 为您的 logcat 中发布的类创建一个空的构造函数...
  • 很明显你需要一个空的构造函数
  • 请从 logcat 发布堆栈跟踪。
  • 但是,视图的空结构仍然没有意义,因为要实例化它至少需要上下文
  • 并且缺少 2 个构造函数,一个需要上下文和样式。同意@blackbelt 没有使用空的构造函数

标签: android


【解决方案1】:

可能是您正在尝试创建如下对象...

SingleTouchEventView view = new SingleTouchEventView ();

但是你没有任何空的构造函数。如果您想暂时解决问题,请在您的SingleTouchEventView 类中创建一个空的Constructor,如下所示...

public SingleTouchEventView() {

}

当你 extends View 上课时,你不能有空的构造函数。所以,上面的构造函数会通过一个错误说...

Implicit super constructor View() is undefined. Must explicitly invoke another constructor

因此,您必须至少通过构造函数传递Context...现在,您应该使用Context 创建另一个Constructor,如下所示...

public SingleTouchEventView(Context context) {
    super(context);
}

public SingleTouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);

}

当你将创建一个 SingleTouchEventView 类的对象时,你初始化如下......

SingleTouchEventView view = new SingleTouchEventView (getApplicationContext());

【讨论】:

  • 我应该把构造函数放在哪里,因为它说:“隐式超级构造函数 View() 未定义。必须显式调用另一个构造函数。”当我把它扔进我的代码时。
  • 不要误会我的意思。但是有一个空的构造函数会导致编译时错误:隐式 View() 构造函数是未定义的。必须显式调用另一个构造函数
  • 是的,但这就是我应该怎么做的全部内容?
  • @We'reAllMadHere 粘贴完整的执行日志
  • @We'reAllMadHere 有第 4 章 Professional Android Devleopment By Retro Meier。它包含您需要了解的有关自定义视图的所有信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2018-09-19
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多