android.view.InflateException:关于编写自定义imageView

时间:2016-03-07 06:47:38

标签: android imageview

我有一个自定义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 个答案:

答案 0 :(得分:6)

从XML中扩展自定义视图时,必须拥有所有正确的构造函数。 尝试添加这些构造函数以及您拥有的构造函数

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

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