Problem in XML, wie rausfinden in welcher XML?

  • Antworten:11
  • Bentwortet
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 11:14:01 via Website

Hiho!
Ich habe das Problem das meine App beim Wechsel des Layouts abstürzt, komischerweise aber immer nur bei jedem zweiten mal. Natürlich habe ich mir das LogCat angeschaut. Da stehen Fehler im Binary XML drin. Ich habe ein Tab Widget und mehre XML Dateien darauf, wie kann ich sehen um welche es geht?

110-12 11:11:06.196: ERROR/AndroidRuntime(753): Uncaught handler: thread main exiting due to uncaught exception
210-12 11:11:06.245: ERROR/AndroidRuntime(753): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.sportwettenblogger.fussballstatistik/de.sportwettenblogger.fussballstatistik.Tabs}: android.view.InflateException: Binary XML file line #28: Error inflating class java.lang.reflect.Constructor
310-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
410-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
510-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3502)
610-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.access$2200(ActivityThread.java:116)
710-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1798)
810-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.os.Handler.dispatchMessage(Handler.java:99)
910-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.os.Looper.loop(Looper.java:123)
1010-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.main(ActivityThread.java:4203)
1110-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Method.invokeNative(Native Method)
1210-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Method.invoke(Method.java:521)
1310-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
1410-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
1510-12 11:11:06.245: ERROR/AndroidRuntime(753): at dalvik.system.NativeStart.main(Native Method)
1610-12 11:11:06.245: ERROR/AndroidRuntime(753): Caused by: android.view.InflateException: Binary XML file line #28: Error inflating class java.lang.reflect.Constructor
1710-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createView(LayoutInflater.java:512)
1810-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
1910-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
2010-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
2110-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
2210-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
2310-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
2410-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
2510-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.Activity.setContentView(Activity.java:1620)
2610-12 11:11:06.245: ERROR/AndroidRuntime(753): at de.sportwettenblogger.fussballstatistik.Tabs.onCreate(Tabs.java:32)
2710-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
2810-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
2910-12 11:11:06.245: ERROR/AndroidRuntime(753): ... 12 more
3010-12 11:11:06.245: ERROR/AndroidRuntime(753): Caused by: java.lang.reflect.InvocationTargetException
3110-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.google.ads.AdView.<init>(Unknown Source)
3210-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Constructor.constructNative(Native Method)
3310-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
3410-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createView(LayoutInflater.java:499)
3510-12 11:11:06.245: ERROR/AndroidRuntime(753): ... 23 more
3610-12 11:11:06.245: ERROR/AndroidRuntime(753): Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class java.lang.reflect.Constructor
3710-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createView(LayoutInflater.java:512)
3810-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
3910-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:562)
4010-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
4110-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:382)
4210-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
4310-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
4410-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.widget.ZoomButtonsController.createContainer(ZoomButtonsController.java:262)
4510-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.widget.ZoomButtonsController.<init>(ZoomButtonsController.java:211)
4610-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.webkit.WebView.initZoomController(WebView.java:617)
4710-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.webkit.WebView.<init>(WebView.java:612)
4810-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.webkit.WebView.<init>(WebView.java:589)
4910-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.webkit.WebView.<init>(WebView.java:580)
5010-12 11:11:06.245: ERROR/AndroidRuntime(753): at g.<init>(Unknown Source)
5110-12 11:11:06.245: ERROR/AndroidRuntime(753): at d.a(Unknown Source)
5210-12 11:11:06.245: ERROR/AndroidRuntime(753): at d.<init>(Unknown Source)
5310-12 11:11:06.245: ERROR/AndroidRuntime(753): at com.google.ads.AdView.a(Unknown Source)
5410-12 11:11:06.245: ERROR/AndroidRuntime(753): ... 27 more
5510-12 11:11:06.245: ERROR/AndroidRuntime(753): Caused by: java.lang.reflect.InvocationTargetException
5610-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.widget.ZoomControls.<init>(ZoomControls.java:49)
5710-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Constructor.constructNative(Native Method)
5810-12 11:11:06.245: ERROR/AndroidRuntime(753): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
5910-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createView(LayoutInflater.java:499)
6010-12 11:11:06.245: ERROR/AndroidRuntime(753): ... 43 more
6110-12 11:11:06.245: ERROR/AndroidRuntime(753): Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class java.lang.reflect.Constructor
6210-12 11:11:06.245: ERROR/AndroidRuntime(753): at android.view.LayoutInflater.createView(Layou

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

12.10.2011, 13:39:29 via Website

Ich sehe da in dem StackTrace zumindest schonmal was von ZoomControls und Google AdView.
Sollte das die Auswahl nicht schon einschränken?

Ansonsten setz dir halt Brechpunkte in den Methoden, die das jeweilige Tab initialisieren (onStart ... oder wie auch immer das beim Tab läuft.)
Dann kannst du jede Initialisierung mit dem Debugger pausieren und siehst welcher Tab die Exception wirft.

— geändert am 12.10.2011, 13:40:09

Antworten
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 14:40:25 via Website

Rafael K. ja das verstehe ich nicht so ganz. ZoomControls gibt es in meiner App gar keine. Null. Google Ad View, das ist Ad Mob denke ich mal, dass kann ich mal raus nehmen. Wobei ich das auch nicht verstehe, da das sich ja normal drehen lässt.
Wie kann ich denn im Debugger paussieren? Ich weiß, dass die Exception im zweiten Tab kommt. Aber nicht ob die TabHost XML oder die TabWidget XML sie auslösen.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

12.10.2011, 14:43:49 via Website

Du machst einen Doppelklick auf die graue Leiste links neben der Codezeile.
Dann erscheint ein blauer Punkt.

Wenn du die App dann über "Debug" statt über "Run" startest und im manifest debuggable="true" steht,
wird die Ausführung der App an diesem Punkt anhalten und du kannst entweder zeilenweise durchgehen, oder mit "play" laufenlassen.
Such dir nur einen Punkt, der für dein Problem eine Rolle spielt.

Ich liebe den Debugger in Eclipse :)

Ben Becker

Antworten
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 14:46:36 via Website

Ah danke so geht das. :) Da ich immer auf RUN gedrückt habe lief er durch. Werde ich dann mal so machen und mal schauen wann er hängen bleibt. Wobei ich ja keinen Punkt in einer XML setzen kann, oder?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

12.10.2011, 15:04:08 via Website

Nope, nur im Code, aber es gibt ja genug CallBack Methoden, die während der Initiatlisierung aufgerufen werden ... onXYZ heissen die meistens.
Da kannst du dich in die Ausführung reinhängen.
Zur Not überschreibst du halt die Methoden und machst ein Log.d("BLA"); rein, um eine Codezeile zu haben, auf der du einen Breakpunkt setzen kannst.

Antworten
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 15:09:42 via Website

Oh man ich habe das Problem gefunden. Ich hatte da stehen
<activity android:name=".Tabs" android:configChanges="orientation"/>

aber es muss wohl heißen:
<activity android:name=".Tabs" android:configChanges="keyboard|keyboardHidden|orientation"/>
Denn sonst startet die App unter bestimmten Vorrausetzungen doch neu beim Drehen. Was das keyboard damit zu tun hat, keine Ahnung. Aber jetzt kommen die Fehler nicht mehr.

— geändert am 12.10.2011, 15:10:44

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

12.10.2011, 15:49:41 via Website

Wenn das "Problem" durch die Angabe von "keyboard|keyboardHidden|orientation" verschwindet dann hast Du einen Fehler in Deiner Anwendung. Ich vermute Du greifst in Tabs.java Zeile 32 im onCreate auf ein Objekt zu das nicht existiert. Mit 99,9% Wahrscheinlichkeit holst Du Dir oberhalb der Zeile 32 mit findViewById ein Objekt das es in einem der verschiedenen Layouts dieser Activity (Horizontal, Vertikal, ...) nicht gibt. In der besagten Zeile nutzt Du dann dieses Objekt ohne es vorher auf NULL geprüft zu haben.

Durch die Angabe von "keyboard|keyboardHidden|orientation" durchläuft die Activity keinen onDestroy/onCreate Zyklus. Da Du auf das fehlerhafte Objekt in Deiner Klasse wohl nur im onCreate zugreifst klappt das wohl.

Wenn man nicht gerade manuell heftige Layouts Änderungen während des Orientation Change durchführt, sondern einfach verschiedene XML Layouts hat, dann ist die Angabe von "keyboard|keyboardHidden|orientation" nicht verkehrt. Es verbirgt aber eigentlich die Programmierfehler ... man sollte zumindest ohne diese Attribute testen.

Gruss
Harald

— geändert am 12.10.2011, 15:53:40

Antworten
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 17:03:18 via Website

Hallo Harald,

ich habe nur ein Layout für Landscape und portrait modus, die wechseln nicht. Das bleiben die selben. Ich erzeuge die Daten auf den Layout dynamisch. Daher kann der Fehler nicht davon kommen, dass ein Landscape XML Layout mehr / andere IDs hat als ein Portrait Modus layout. Die wechsel ich einfach nicht.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

12.10.2011, 21:30:59 via Website

Ok, aber der Fehler zeigt eindeutig das beim Orientation Change ein Objekt nicht existiert.

Ist das ein Fragment? Zeig mal onCreate bzw. onCreateView.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

12.10.2011, 22:04:30 via Website

Man sieht ja im StackTrace versteckt eine InvocationTargetException, die von einem View ausgelöst wird als Cause.
Spricht evtl. dafür, dass das Objekt, auf das dort zugegriffen wird sich in falschen Zustand seines Lebenszyklus befindet.

Könnte auch sein, dass eine View-Instanz, die mit dem Schliessen der alten Activity "finalisiert" wurde, beim onCreate der neuen Activity recycled wird.

— geändert am 12.10.2011, 22:06:37

Antworten
Ben Becker
  • Forum-Beiträge: 209

12.10.2011, 22:06:54 via Website

Das würde das AdView ja erklären. Die Daten werden grade geladen -> ab startet neu, es wird versucht die View mit Daten zubeliefern, diese ist aber (noch) nicht da.
Sorry habe die App schon weiter umgebaut. :) Bin ja grade im lernen. Daher bringt es nichts jetzt was neues zu zeigen was nicht zu den Fehlern passte. Aber danke das du schauen willst.

Antworten