[英]runtime InflateException when trying to use a Custom View in xml layout
[英]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.