5

I get error message when trying to run my Project. I want to create Tic Tac Toe for Android, and I use custom View below to create Tic Tac Toe board:

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

Next, I place it in XML based activity layout like this:

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

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

</LinearLayout>

So I get fatal exception error in my Eclipse LogCat window:

AndroidRuntime(329): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.me.TicTacToe/org.me.TicTacToe.ui.TicTacToeActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class org.me.TicTacToe.ui.TicTacToeBoard

How to fix it?

Full Logcat lines:

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 ComponentInfo{org.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
2
  • Please, show us more lines of your logcat. I believe that the reason of the crash is listed before, somewhere in a board constructor. Commented Feb 12, 2012 at 5:01
  • @Olegas, here is my full logcat lines. I added it to my first post Commented Feb 12, 2012 at 5:26

1 Answer 1

27

You're missing the constructor for TicTacToeBoard(Context, Attributeset). see this question, for example.

EDIT: It's right there in the LogCat you just posted:

  Caused by: java.lang.NoSuchMethodException: TicTacToeBoard(Context,AttributeSet)
Sign up to request clarification or add additional context in comments.

3 Comments

thank's for your answer, it really works! It ends my 2 days's headache
@Spongeboss please accept it as correct answer. thnx... it worked :)
+1 for asking to see the "Caused by" clause. Mine was "ClassNotFound Exception" and the cause way I misspelled my class name

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.