2016-10-14 1 views
1

Ich habe versucht, eine benutzerdefinierte Ansicht für 3 Tage zu erstellen. Ich habe jedes einzelne Tutorial verfolgt, aber ich bekomme immer wieder den Fehler "ClassNotFoundException". Ich möchte einen Joystick machen, aber um diese Frage zu vereinfachen, habe ich versucht, eine Button zu erweitern und sie zu verwenden, bei der ich nicht erfolgreich sein konnte.Wie erstelle ich eine benutzerdefinierte Ansicht in einer Android-Anwendung?

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> 

Es beschwert sich nicht gar zu kompilieren, aber sobald ich die App zu starten, stürzt mit diesem Fehler:

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 

Ich habe versucht, die XML-Datei zu ändern:

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

Es läuft, aber die Ansicht verhält sich wie eine normale Taste und meine Klasse ist ungenutzt.

Ich habe die App auf verschiedenen Geräten ausprobiert; alle geben die selbe Ausnahme.

Vergesse ich etwas? Ich hoffe, ich habe gerade einen einfachen Fehler gemacht. Vielen Dank im Voraus!

+0

Es scheint zu diesem Problem ähnlich zu sein. Etwas stimmt nicht mit der Dex-Datei. http://stackoverflow.com/questions/10866431/android-activity-classnotfundexception-tried-everything – alan7678

Antwort

1

Bewegen Sie entweder Ihre CustomButton Klasse auf die oberste Ebene, oder machen Sie sie static. kann Ihre Klasse nicht instanziieren, da es sich um eine nicht statische innere Klasse handelt.

+0

Vielen Dank! Die Klasse statisch zu machen funktionierte nicht für mich, aber das Verschieben der Klasse in ihre eigene Java-Datei löste das Problem und ich kann mein Projekt schließlich fortsetzen. –

+0

Gern geschehen! – Egor

Verwandte Themen