android.view.InflateException: Binary XML file line #7: Error inflating class

Posted

技术标签:

【中文标题】android.view.InflateException: Binary XML file line #7: Error inflating class【英文标题】: 【发布时间】:2012-03-04 00:31:24 【问题描述】:

尝试运行我的项目时收到错误消息。我想为 android 创建井字游戏,我使用下面的自定义视图来创建井字游戏板:

package org.me.TicTacToe.ui;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;

public class TicTacToeBoard extends View 

    private Tile[][] tile = null;   //Abstract class to create tiles in Tic Tac Toe Board
    int boardWidth = 3; //It mean Tic Tac Toe board is consists of 3x3 tiles
    private int width;
    private int height;
    private Paint brush;

    public TicTacToeBoard(Context context) 
        super(context);

        brush = new Paint();
        this.brush.setARGB(255, 0, 0, 0);
        this.brush.setAntiAlias(true);
        this.brush.setStyle(Style.STROKE);
        this.brush.setStrokeWidth(5);

        width = this.getWidth();
        height = this.getHeight();

        initBoard();
    

    @Override
    protected void onDraw(Canvas canvas) 
        for (int i = 0; i < tile.length; i++) 
            for (int j = 0; j < tile[0].length; j++) 
                tile[i][j].draw(canvas, getResources(), j, i,
                    (this.getWidth() + 3) / tile.length,
                    this.getHeight() / tile[0].length);
            
        

        int xs = this.getWidth() / boardWidth;
        int ys = this.getHeight() / boardWidth;
        for (int i = 0; i <= boardWidth; i++) 
            canvas.drawLine(xs * i, 0, xs * i, this.getHeight(), brush);
        
        for (int i = 0; i <= boardWidth; i++) 
            canvas.drawLine(0, ys * i, this.getWidth(), ys * i, brush);
        

        super.onDraw(canvas);
    

    public void initBoard()
        tile = new Tile[boardWidth][boardWidth];

        int xss = width / boardWidth;
        int yss = height / boardWidth;

        for (int row = 0; row < boardWidth; row++) 
            for (int colmn = 0; colmn < boardWidth; colmn++) 
                tile[row][colmn] = new TileEmpty(xss * colmn, row * yss);
                // TileEmpty is extend class from Tile.
                // TileEmpty represent empty tile in Tic Tac Toe
            
        
    

接下来,我将它放在基于 XML 的活动布局中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <org.me.TicTacToe.ui.TicTacToeBoard
        android:id="@+id/game1"
        android:layout_
        android:layout_ />

</LinearLayout>

所以我的 Eclipse LogCat 窗口中出现致命异常错误:

AndroidRuntime(329): java.lang.RuntimeException: Unable to start activity ComponentInfoorg.me.TicTacToe/org.me.TicTacToe.ui.TicTacToeActivity:  org.me.TicTacToe.ui.TicTacToeBoard

如何解决?

完整的 Logcat 行:

02-12 10:22:31.989: D/AndroidRuntime(329): Shutting down VM
02-12 10:22:31.989: W/dalvikvm(329): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-12 10:22:32.008: E/AndroidRuntime(329): FATAL EXCEPTION: main
02-12 10:22:32.008: E/AndroidRuntime(329): java.lang.RuntimeException:
                    Unable to start activity ComponentInfoorg.me.TicTacToe/org.rme.TicTacToe.ui.TicTacToeActivity:
                    android.view.InflateException: Binary XML file line #18: Error inflating class org.me.TicTacToe.ui.TicTacToeBoard
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.os.Looper.loop(Looper.java:123)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-12 10:22:32.008: E/AndroidRuntime(329):  at java.lang.reflect.Method.invokeNative(Native Method)
02-12 10:22:32.008: E/AndroidRuntime(329):  at java.lang.reflect.Method.invoke(Method.java:507)
02-12 10:22:32.008: E/AndroidRuntime(329):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-12 10:22:32.008: E/AndroidRuntime(329):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-12 10:22:32.008: E/AndroidRuntime(329):  at dalvik.system.NativeStart.main(Native Method)
02-12 10:22:32.008: E/AndroidRuntime(329): Caused by: android.view.InflateException: Binary XML file line #7:
                    Error inflating class org.me.TicTacToe.ui.TicTacToeBoard
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.createView(LayoutInflater.java:508)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
02-12 10:22:32.008: E/AndroidRuntime(329):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.Activity.setContentView(Activity.java:1657)
02-12 10:22:32.008: E/AndroidRuntime(329):  at org.me.TicTacToe.ui.TicTacToeActivity.onCreate(TicTacToeActivity.java:24)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-12 10:22:32.008: E/AndroidRuntime(329):  ... 11 more
02-12 10:22:32.008: E/AndroidRuntime(329): Caused by: java.lang.NoSuchMethodException: TicTacToeBoard(Context,AttributeSet)
02-12 10:22:32.008: E/AndroidRuntime(329):  at java.lang.Class.getMatchingConstructor(Class.java:643)
02-12 10:22:32.008: E/AndroidRuntime(329):  at java.lang.Class.getConstructor(Class.java:472)
02-12 10:22:32.008: E/AndroidRuntime(329):  at android.view.LayoutInflater.createView(LayoutInflater.java:480)
02-12 10:22:32.008: E/AndroidRuntime(329):  ... 21 more

【问题讨论】:

请向我们展示您的 logcat 的更多行。我相信崩溃的原因之前已经列出,在电路板构造函数的某个地方。 @Olegas,这是我完整的 logcat 行。我将它添加到我的第一篇文章中 【参考方案1】:

您缺少TicTacToeBoard(Context, Attributeset) 的构造函数。例如,参见this question。

编辑: 它就在您刚刚发布的 LogCat 中:

  Caused by: java.lang.NoSuchMethodException: TicTacToeBoard(Context,AttributeSet)

【讨论】:

感谢您的回答,它确实有效!它结束了我 2 天的头痛 @Spongeboss 请接受它作为正确答案。 thnx ...它工作:) +1 要求查看“Caused by”子句。我的是“ClassNotFound Exception”,原因是我拼错了我的班级名称

以上是关于android.view.InflateException: Binary XML file line #7: Error inflating class的主要内容,如果未能解决你的问题,请参考以下文章