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

A

Andro-medanebel

Neues Mitglied
0
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?
 
wie in fast jedem eintrag hier

bitte die ausgaben aus dem logcat rein kopieren. ( wenn du nicht weißt was logcat ist => forensuche nutzen )
 
  • Danke
Reaktionen: Andro-medanebel
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
 
  • Danke
Reaktionen: Andro-medanebel
swordi schrieb:
wie in fast jedem eintrag hier

bitte die ausgaben aus dem logcat rein kopieren. ( wenn du nicht weißt was logcat ist => forensuche nutzen )

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:
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.
 
java4life schrieb:
so richtig weiß ich nicht,was du willst...

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.
 
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?
 
  • Danke
Reaktionen: Andro-medanebel
Kranki schrieb:
Sieht aus, als ob da ein Constructor fehlt, den ein View haben sollte.

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.
 
Kranki schrieb:
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?

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?
 
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.
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.050
jogimuc
J
M
  • MikelKatzengreis
Antworten
5
Aufrufe
118
swa00
swa00
S
Antworten
33
Aufrufe
2.659
Sempervivum
S
Zurück
Oben Unten