1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Custom View in XML-Datei: "Anwendung ... unerwartet beendet"

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Andro-medanebel, 06.02.2011.

  1. Andro-medanebel, 06.02.2011 #1
    Andro-medanebel

    Andro-medanebel Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2010
    Ich versuche meine Anwendung um ein Custom View zu erweitern, was jedoch zu dem Laufzeitfehler
    "Die Anwendung ... wurde unerwartet beendet." führt. Ohne Custom View läuft meine Anwendung fehlerfrei:

    Meine main.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <com.customview.CustomLayout  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/custom_layout_id"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout_id"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"    
        >
    <TextView  
        android:id="@+id/text_view"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    </RelativeLayout>
    </com.customview.CustomLayout>
    
    Mein package com.customview:
    Code:
    ...
    public class CustomLayout extends RelativeLayout{
    ...}
    ...
    
    Meine Pacakage-Struktur:
    Code:
    com
      customview
         CustomLayout.java
      memory
         MemoryActivity.java
    
    Warum bekomme ich einen "Die Anwendung wurde unerwartet beendet"-Fehler und wie kann ich meinen Code korrigieren?
     
  2. swordi, 06.02.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    wie in fast jedem eintrag hier

    bitte die ausgaben aus dem logcat rein kopieren. ( wenn du nicht weißt was logcat ist => forensuche nutzen )
     
    Andro-medanebel bedankt sich.
  3. java4life, 07.02.2011 #3
    java4life

    java4life Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    1
    Registriert seit:
    23.01.2011
    so richtig weiß ich nicht,was du willst...wenn du ein eigenes layout definierst,dann mach das doch in einer eigenen xml datei...

    z.B. neue.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="#ff00ff"
        android:text="This is Activity 2" />
    </LinearLayout>
    
    dieses lädst du dann mit setContentView(R.layout.neue);

    willst du aus der "MainActivity" zb. eine neue view laden,dann nehm:
    Intent intent = new Intent (this,CustomLayout.class );
    startActivity(intent);

    dann muss aber in der CustomLayout.java auch ein layout definiert sein, wie zb.
    setContentView(R.layout.neue)

    und was bei dir noch sein könnte,du musst die dateien in der manifest-datei bekannt machen wie:
    <activity android:name=".CustomLayout" />

    vielleicht hilft es dir ja...mfg
     
    Andro-medanebel bedankt sich.
  4. Andro-medanebel, 07.02.2011 #4
    Andro-medanebel

    Andro-medanebel Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2010
    Logcat-Verbose-Ausgaben:

    Code:
    02-07 15:06:55.822: DEBUG/AndroidRuntime(395): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
    02-07 15:06:55.832: DEBUG/AndroidRuntime(395): CheckJNI is ON
    02-07 15:06:56.012: DEBUG/AndroidRuntime(395): --- registering native functions ---
    02-07 15:06:56.022: INFO/jdwp(395): received file descriptor 22 from ADB
    02-07 15:06:56.222: DEBUG/ddm-heap(395): Got feature list request
    02-07 15:06:56.682: DEBUG/AndroidRuntime(395): Shutting down VM
    02-07 15:06:56.682: DEBUG/dalvikvm(395): DestroyJavaVM waiting for non-daemon threads to exit
    02-07 15:06:56.682: DEBUG/dalvikvm(395): DestroyJavaVM shutting VM down
    02-07 15:06:56.682: DEBUG/dalvikvm(395): HeapWorker thread shutting down
    02-07 15:06:56.692: DEBUG/dalvikvm(395): HeapWorker thread has shut down
    02-07 15:06:56.692: DEBUG/jdwp(395): JDWP shutting down net...
    02-07 15:06:56.692: DEBUG/jdwp(395): +++ peer disconnected
    02-07 15:06:56.692: INFO/dalvikvm(395): Debugger has detached; object registry had 1 entries
    02-07 15:06:56.702: DEBUG/dalvikvm(395): VM cleaning up
    02-07 15:06:56.722: DEBUG/dalvikvm(395): LinearAlloc 0x0 used 665652 of 4194304 (15%)
    02-07 15:06:57.122: DEBUG/AndroidRuntime(405): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
    02-07 15:06:57.122: DEBUG/AndroidRuntime(405): CheckJNI is ON
    02-07 15:06:57.312: DEBUG/AndroidRuntime(405): --- registering native functions ---
    02-07 15:06:57.312: INFO/jdwp(405): received file descriptor 22 from ADB
    02-07 15:06:57.522: DEBUG/ddm-heap(405): Got feature list request
    02-07 15:06:57.982: INFO/ActivityManager(52): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.memory/.MemoryActivity }
    02-07 15:06:58.052: DEBUG/AndroidRuntime(405): Shutting down VM
    02-07 15:06:58.052: DEBUG/dalvikvm(405): DestroyJavaVM waiting for non-daemon threads to exit
    02-07 15:06:58.062: DEBUG/dalvikvm(405): DestroyJavaVM shutting VM down
    02-07 15:06:58.062: DEBUG/dalvikvm(405): HeapWorker thread shutting down
    02-07 15:06:58.062: DEBUG/dalvikvm(405): HeapWorker thread has shut down
    02-07 15:06:58.072: DEBUG/jdwp(405): JDWP shutting down net...
    02-07 15:06:58.072: DEBUG/jdwp(405): +++ peer disconnected
    02-07 15:06:58.072: INFO/dalvikvm(405): Debugger has detached; object registry had 1 entries
    02-07 15:06:58.082: DEBUG/dalvikvm(405): VM cleaning up
    02-07 15:06:58.152: INFO/ActivityManager(52): Start proc com.memory for activity com.memory/.MemoryActivity: pid=413 uid=10022 gids={}
    02-07 15:06:58.172: DEBUG/dalvikvm(405): LinearAlloc 0x0 used 676828 of 4194304 (16%)
    02-07 15:06:58.252: INFO/jdwp(413): received file descriptor 10 from ADB
    02-07 15:06:58.302: DEBUG/ddm-heap(413): Got feature list request
    02-07 15:06:58.612: DEBUG/AndroidRuntime(413): Shutting down VM
    02-07 15:06:58.612: WARN/dalvikvm(413): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
    02-07 15:06:58.612: ERROR/AndroidRuntime(413): Uncaught handler: thread main exiting due to uncaught exception
    02-07 15:06:58.632: ERROR/AndroidRuntime(413): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.memory/com.memory.MemoryActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class com.customview.CustomLayout
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.os.Handler.dispatchMessage(Handler.java:99)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.os.Looper.loop(Looper.java:123)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread.main(ActivityThread.java:4203)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.reflect.Method.invokeNative(Native Method)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.reflect.Method.invoke(Method.java:521)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at dalvik.system.NativeStart.main(Native Method)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class com.customview.CustomLayout
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.createView(LayoutInflater.java:502)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.Activity.setContentView(Activity.java:1620)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at com.memory.MemoryActivity.onCreate(MemoryActivity.java:31)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     ... 11 more
    02-07 15:06:58.632: ERROR/AndroidRuntime(413): Caused by: java.lang.NoSuchMethodException: CustomLayout(Context,AttributeSet)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.Class.getMatchingConstructor(Class.java:669)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.Class.getConstructor(Class.java:484)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.createView(LayoutInflater.java:474)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     ... 20 more
    02-07 15:06:58.642: INFO/Process(52): Sending signal. PID: 413 SIG: 3
    02-07 15:06:58.652: INFO/dalvikvm(413): threadid=7: reacting to signal 3
    02-07 15:06:58.672: INFO/dalvikvm(413): Wrote stack trace to '/data/anr/traces.txt'
    
    So sieht meine AndroidSimpleMemoryGameManifest.xml-Datei aus:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.memory"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".MemoryActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".CustomLayout" />
                
        </application>
        <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="9"/>
        <supports-screens></supports-screens>
    </manifest>
    
    Mir ist unklar, ob ich CustomLayout im Manifest bekanntmachen muß, da es ja ein View und keine Activity ist, aber den Laufzeitfehler bekomme ich
    unabhängig davon, ob diese Zeile
    Code:
    <activity android:name=".CustomLayout" />
    im Manifest ist oder nicht.

    Inder MemoryActivity versuche ich so auf mein Layout zuzugreifen:
    Code:
    public class MemoryActivity extends Activity {
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            setContentView(R.layout.main);
            RelativeLayout xml_layout = (RelativeLayout) findViewById(R.id.custom_layout_id);
    
     
    Zuletzt bearbeitet: 07.02.2011
  5. Kranki, 07.02.2011 #5
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Code:
    02-07 15:06:58.632: ERROR/AndroidRuntime(413): Caused by: java.lang.NoSuchMethodException: CustomLayout(Context,AttributeSet)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.Class.getMatchingConstructor(Class.java:669)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at java.lang.Class.getConstructor(Class.java:484)
    02-07 15:06:58.632: ERROR/AndroidRuntime(413):     at android.view.LayoutInflater.createView(LayoutInflater.java:474)
    Sieht aus, als ob da ein Constructor fehlt, den ein View haben sollte.
     
  6. Andro-medanebel, 07.02.2011 #6
    Andro-medanebel

    Andro-medanebel Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2010
    Mein letztendliches Anliegen ist, die Länge der x- und y-Achse des Layouts
    zu messen. Wie ich gelesen habe, muß man das in der Methode
    onSizeChanged machen, damit man nicht 0 geliefert bekommt.

    Das XML-Layout umhülle ich nun in der XML-Datei mit einem CustomLayout,
    um die Methode onSizeChanged nutzen zu können:
    Code:
    public class CustomLayout extends RelativeLayout{
    int w_class_variable;
    int h_class_variable;
    ...
    @Override
        protected void onSizeChanged(int w, int h, int ow, int oh){
            super.onSizeChanged(w, h, ow, oh);
            w_class_variable = w;
            h_class_variable = h;
        }
    
    Im Prinzip habe ich versucht, das hier - auf meinen Zweck angepaßt -nachzuprogrammieren:
    What's the best way to draw a pie chart in Android with selectable slices? - Stack Overflow

    Bisher jedoch ohne Erfolg.
     
  7. Kranki, 07.02.2011 #7
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Code:
    public CustomLayout (Context c) {
         super(c);
    }
    
    public CustomLayout (Context c, AttributeSet a) {
        super(c, a);
    }
    
    public CustomLayout (Context c, AttributeSet a, int i) {
        super(c, a, i);
    }
    
    Das hier quasi. Hat deine Klasse sowas?
     
    Andro-medanebel bedankt sich.
  8. Andro-medanebel, 07.02.2011 #8
    Andro-medanebel

    Andro-medanebel Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2010
    Tatsächlich, das wars! Hatte zwar einen Konstruktor
    public CustomLayout(Context context) aber er will
    einen mit zwei Parametern public CustomLayout(Context context, AttributeSet attrs). Mein Vorbild-Beispiel hat auch einen Konstruktor mit zwei
    Parametern.( http://stackoverflow.com/questions/4769084/whats-the-best-way-to-draw-a-pie-chart-in-android-with-selectable-slices ).

    Warum ich das zum Falschen geändert habe, weiß ich nicht mehr.

    Aber jetzt läuft es!

    Danke dich und an die Anderen für die Hilfe.
     
  9. Andro-medanebel, 07.02.2011 #9
    Andro-medanebel

    Andro-medanebel Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2010
    Muß man immer alle Konstruktor-Varianten in den Code einbauen.
    Mein Programm läuft z.B., wenn ich nur die mit den zwei Parametern
    nehme. Sollte ich den mit einem und mit drei Parametern trotzdem
    in den Code einbauen?
     
  10. Kranki, 07.02.2011 #10
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Die View-Klasse hat alle drei, und Konstruktoren werden nicht vererbt. Ich würde schon allein aus Konsistenzgründen alle drei einbauen, um späteren Problemen gleich vorzubeugen. Ist ja kein Aufwand.
     

Diese Seite empfehlen