安卓视图膨胀异常:在编写自定义imageView时

4
我有一个自定义的ImageView类,如下所示:
public class MyImageView extends ImageView
{

public MyImageView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    canvas.drawLine(0, 0, 20, 20, p);
    super.onDraw(canvas);
}
}

在我的Activity类中,Oncreate方法被定义为:

MyImageView imageView;
      // It works perfect when i use ImageView instead of MyImageView 
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView=(MyImageView)findViewById(R.id.image);
    Bitmap dbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dinkan);
    Bitmap bitmap = dbitmap.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    imageView.setImageBitmap(bitmap);
}

最终会以InflateException引起的RuntimeException结束。以下是错误日志:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hari.myapplication/com.example.hari.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class com.example.hari.myapplication.MyImageView
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
          at android.app.ActivityThread.access$800(ActivityThread.java:151)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
          at android.os.Handler.dispatchMessage(Handler.java:110)
          at android.os.Looper.loop(Looper.java:193)
          at android.app.ActivityThread.main(ActivityThread.java:5299)
          at java.lang.reflect.Method.invokeNative(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:515)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
          at dalvik.system.NativeStart.main(Native Method)
       Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class com.example.hari.myapplication.MyImageView
          at android.view.LayoutInflater.createView(LayoutInflater.java:603)
          at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
          at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)
          at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
          at com.example.hari.myapplication.MainActivity.onCreate(MainActivity.java:29)
          at android.app.Activity.performCreate(Activity.java:5264)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
          at android.app.ActivityThread.access$800(ActivityThread.java:151) 
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
          at android.os.Handler.dispatchMessage(Handler.java:110) 
          at android.os.Looper.loop(Looper.java:193) 
          at android.app.ActivityThread.main(ActivityThread.java:5299) 
          at java.lang.reflect.Method.invokeNative(Native Method) 
          at java.lang.reflect.Method.invoke(Method.java:515) 
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
          at dalvik.system.NativeStart.main(Native Method) 
       Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
          at java.lang.Class.getConstructorOrMethod(Class.java:472)
          at java.lang.Class.getConstructor(Class.java:446)
          at android.view.LayoutInflater.createView(LayoutInflater.java:568)
          at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
          at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
          at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
          at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
          at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
          at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
          at com.example.hari.myapplication.MainActivity.onCreate(MainActivity.java:29) 
          at android.app.Activity.performCreate(Activity.java:5264) 
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302) 
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
          at android.app.ActivityThread.access$800(ActivityThread.java:151) 
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
          at android.os.Handler.dispatchMessage(Handler.java:110) 
          at android.os.Looper.loop(Looper.java:193) 
          at android.app.ActivityThread.main(ActivityThread.java:5299) 
          at java.lang.reflect.Method.invokeNative(Native Method

但是当我使用ImageView而不是自定义的ImageView(MyImageView)时,它可以完美地工作。那么我的代码有什么问题?任何帮助都将不胜感激。

1个回答

6

当从 XML 中填充自定义 View 时,必须拥有所有正确的构造函数。请尝试添加这些构造函数以及您已有的构造函数。

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

public MyImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

这是问题。谢谢。 - Hari Krishnan
谢谢!刚刚花了30分钟在这个上面。 - Zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接