1

I've been trying to create a custom view for 3 days. I've followed every single tutorial but I keep getting the error "ClassNotFoundException". I want to make a joystick, but to simplify this question, I tried to extend a Button and use it, at which I couldn't succeed.

MainActivity.java:

package com.stefan.example;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    public class CustomButton extends Button
    {
        public CustomButton(Context context) {
            super(context);
        }

        public CustomButton(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

acitivity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.stefan.example.MainActivity">

    <com.stefan.example.MainActivity.CustomButton
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

It does not complain at compiling at all, but as soon as I start the app, it crashes with this error:

10-14 17:31:58.476 15869-15869/com.stefan.example E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.stefan.example, PID: 15869
                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stefan.example/com.stefan.example.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.stefan.example.MainActivity.CustomButton
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366)
                                                                        at android.app.ActivityThread.access$800(ActivityThread.java:149)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:135)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5297)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
                                                                     Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.stefan.example.MainActivity.CustomButton
                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757)
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
                                                                        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)
                                                                        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
                                                                        at com.stefan.example.MainActivity.onCreate(MainActivity.java:30)
                                                                        at android.app.Activity.performCreate(Activity.java:6020)
                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366) 
                                                                        at android.app.ActivityThread.access$800(ActivityThread.java:149) 
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:135) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5297) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 
                                                                     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.stefan.example.MainActivity.CustomButton" on path: DexPathList[[zip file "/data/app/com.stefan.example-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
                                                                        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                                        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                                                        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                                                        at android.view.LayoutInflater.createView(LayoutInflater.java:571)
                                                                        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
                                                                        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                                                                        at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
                                                                        at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280) 
                                                                        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
                                                                        at com.stefan.example.MainActivity.onCreate(MainActivity.java:30) 
                                                                        at android.app.Activity.performCreate(Activity.java:6020) 
                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259) 
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2366) 
                                                                        at android.app.ActivityThread.access$800(ActivityThread.java:149) 
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:135) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5297) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703) 
                                                                        Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.stefan.example.MainActivity.CustomButton" on path: DexPathList[[dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-support-annotations-24.1.1_6ce5cf7d8fc68e278012c1fdb63847d6984b1a82-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-internal_impl-24.1.1_d7334ac7335287759c12e17e515a73749d4ea418-classes.dex", dex file "/data/data/com.stefan.example/files/instant-run/dex/slice-com.android.support-support-vector-drawable-24.1.1_e21575ccf9da39363d36f579d76036b9825e0829-classes.dex

I've tried changing the xml file:

<Button
        class = "com.stefan.example.MainActivity.CustomButton"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

It runs, but the view behaves like a normal button and my class is unused.

I've tried the app on different devices; all give the same exception.

Do I forget something? I hope I've just made a simple mistake. Thank you in advance!

1

1 Answer 1

1

Either move your CustomButton class to the top level, or make it static. LayoutInflater fails to instantiate your class as it's a non-static inner class.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much! Making the class static did not work for me but moving the class to it's own java file solved the problem, and I can finaly continue with my project.

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.