简体   繁体   English

尝试绘制自定义视图时崩溃-InflateException

[英]Crashing when attempting to draw a custom view - InflateException

I have tried searching for this issue. 我尝试搜索此问题。 I have seen similar experiences in other questions but they were working with different resources. 我在其他问题上也有类似的经历,但是他们使用不同的资源。 I am attempting to draw a rectangle on screen with which to perform different actions based on clicking different buttons. 我正在尝试在屏幕上绘制一个矩形,以根据单击不同的按钮来执行不同的操作。 I'm still pretty new to Android so any help would be appreciated. 我对Android还是很陌生,因此不胜感激。 My preview looks fine, exactly like what I'm trying to do, but crashes in the emulator. 我的预览看起来像我想做的一样,但是在模拟器中崩溃了。

I am trying to draw a rectangle in my activity. 我正在尝试在活动中绘制一个矩形。 I created a custom view class that is supposed to draw a triangle. 我创建了一个自定义视图类,该类应该绘制一个三角形。 I then tried to add that view to my content_main.xml but it throws the inflateException error. 然后,我尝试将该视图添加到我的content_main.xml中,但是它引发inflateException错误。

ColorRectView class: ColorRectView类:

public class ColorRectView extends View {

private Rect rectangle;
private Paint paint;

public ColorRectView(Context context) {
    super(context);
    int x = 50;
    int y = 50;
    int sideLength = 200;

    // Create a rectangle to hold the random color
    rectangle = new Rect(x, y, sideLength, sideLength);

    // Create the Paint and set it's color
    paint = new Paint();
    paint.setColor(Color.GRAY);
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawRect(rectangle, paint);
}

content_main.xml content_main.xml

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">

<colorRectPractice.ColorRectView
    android:id="@+id/colorRectangle"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

// This was the original view container that I added using the design tab, gave me the same error
    <!--<view-->
    <!--class="colorRectPractice.ColorRectView"-->
    <!--id="@+id/view4"-->
    <!--android:layout_width="wrap_content"-->
    <!--android:layout_height="wrap_content"-->
    <!--tools:layout_editor_absoluteX="74dp"-->
    <!--tools:layout_editor_absoluteY="178dp" />-->


</android.support.constraint.ConstraintLayout>

I'm getting this error: 我收到此错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{colorRectPractice/colorRectPractice.MainActivity}: android.view.InflateException: Binary XML file line #23: Binary XML file line #17: Error inflating class colorRectPractice.ColorRectView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4754)
    at android.app.ActivityThread.-wrap18(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1599)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: android.view.InflateException: Binary XML file line #23: Binary XML file line #17: Error inflating class xyz.softdev.colorswipe.ColorRectView
 Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class xyz.softdev.colorswipe.ColorRectView
 Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
    at java.lang.Class.getConstructor0(Class.java:2320)
    at java.lang.Class.getConstructor(Class.java:1725)
    at android.view.LayoutInflater.createView(LayoutInflater.java:615)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
    at xyz.softdev.colorswipe.MainActivity.onCreate(MainActivity.java:22)
    at android.app.Activity.performCreate(Activity.java:6975)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4754)
    at android.app.ActivityThread.-wrap18(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1599)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

you are missing AttributeSet in your custom view constructor. 您在自定义视图构造函数中缺少AttributeSet

Here is an Example of making simple Piechart. 这是制作简单Piechart的示例。

 import android.content.Context; import android.content.res.TypedArray; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.util.AttributeSet; import android.view.View; import com.talview.recruit.R; public class DonutChart extends View { private float radius; Paint paint; Paint shadowPaint; Path myPath; Path shadowPath; RectF outterCircle; RectF innerCircle; RectF shadowRectF; public DonutChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.DonutChart, 0, 0 ); try { radius = a.getDimension(R.styleable.DonutChart_radius, 20.0f); } finally { a.recycle(); } paint = new Paint(); paint.setDither(true); paint.setStyle(Paint.Style.FILL); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setAntiAlias(true); paint.setStrokeWidth(radius / 14.0f); shadowPaint = new Paint(); shadowPaint.setColor(0xf0000000); shadowPaint.setStyle(Paint.Style.STROKE); shadowPaint.setAntiAlias(true); shadowPaint.setStrokeWidth(4.0f); shadowPaint.setMaskFilter(new BlurMaskFilter(4, BlurMaskFilter.Blur.SOLID)); myPath = new Path(); shadowPath = new Path(); outterCircle = new RectF(); innerCircle = new RectF(); shadowRectF = new RectF(); float adjust = (.019f*radius); shadowRectF.set(adjust, adjust, radius*2-adjust, radius*2-adjust); adjust = .038f * radius; outterCircle.set(adjust, adjust, radius*2-adjust, radius*2-adjust); adjust = .276f * radius; innerCircle.set(adjust, adjust, radius*2-adjust, radius*2-adjust); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // green setGradient(0xff84BC3D,0xff5B8829); drawDonut(canvas,paint, 0,60); //red setGradient(0xffe04a2f,0xffB7161B); drawDonut(canvas,paint, 60,60); // blue setGradient(0xff4AB6C1,0xff2182AD); drawDonut(canvas,paint, 120,60); // yellow setGradient(0xffFFFF00,0xfffed325); drawDonut(canvas,paint, 180,180); } public void drawDonut(Canvas canvas, Paint paint, float start,float sweep){ myPath.reset(); myPath.arcTo(outterCircle, start, sweep, false); myPath.arcTo(innerCircle, start+sweep, -sweep, false); myPath.close(); canvas.drawPath(myPath, paint); } public void setGradient(int sColor, int eColor){ paint.setShader(new RadialGradient(radius, radius, radius-5, new int[]{sColor,eColor}, new float[]{.6f,.95f},TileMode.CLAMP) ); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int desiredWidth = (int) radius*2; int desiredHeight = (int) radius*2; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; //70dp exact if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; }else if (widthMode == MeasureSpec.AT_MOST) { //wrap content width = Math.min(desiredWidth, widthSize); } else { width = desiredWidth; } //Measure Height if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { height = Math.min(desiredHeight, heightSize); } else { height = desiredHeight; } //MUST CALL THIS setMeasuredDimension(width, height); } } 

You must declare the multiple constructors in your ColorRectView 您必须在ColorRectView中声明多个构造函数

constructor(context: Context)
constructor(context: Context, attrSet : AttributeSet)
constructor(context: Context, attrSet: AttributeSet, defStyleAttributeSet : Int)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM