簡體   English   中英

嘗試繪制自定義視圖時崩潰-InflateException

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

我嘗試搜索此問題。 我在其他問題上也有類似的經歷,但是他們使用不同的資源。 我正在嘗試在屏幕上繪制一個矩形,以根據單擊不同的按鈕來執行不同的操作。 我對Android還是很陌生,因此不勝感激。 我的預覽看起來像我想做的一樣,但是在模擬器中崩潰了。

我正在嘗試在活動中繪制一個矩形。 我創建了一個自定義視圖類,該類應該繪制一個三角形。 然后,我嘗試將該視圖添加到我的content_main.xml中,但是它引發inflateException錯誤。

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

<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>

我收到此錯誤:

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)

您在自定義視圖構造函數中缺少AttributeSet

這是制作簡單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); } } 

您必須在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