App crash auf Tablet aber nicht auf Smartphone

  • Antworten:28
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 14

22.05.2014, 09:24:59 via Website

Hallo,

ich bin dabei eine App zu entwickeln. Auf meinem Galaxy S4 funktioniert sie ohne probleme. Aber auf meinem Galaxy Tab 10.1N stürzt die app ab sobald ich ein ImageView drücke.

<code> 05-22 09:07:20.900: E/AndroidRuntime(26699): FATAL EXCEPTION: main
05-22 09:07:20.900: E/AndroidRuntime(26699): java.lang.IllegalStateException: Could not execute method of the activity
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.view.View$1.onClick(View.java:3098)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.view.View.performClick(View.java:3620)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.view.View$PerformClick.run(View.java:14322)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.os.Handler.handleCallback(Handler.java:605)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.os.Looper.loop(Looper.java:137)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.app.ActivityThread.main(ActivityThread.java:4507)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invoke(Method.java:511)
05-22 09:07:20.900: E/AndroidRuntime(26699): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
05-22 09:07:20.900: E/AndroidRuntime(26699): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
05-22 09:07:20.900: E/AndroidRuntime(26699): at dalvik.system.NativeStart.main(Native Method)
05-22 09:07:20.900: E/AndroidRuntime(26699): Caused by: java.lang.reflect.InvocationTargetException
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invoke(Method.java:511)
05-22 09:07:20.900: E/AndroidRuntime(26699): at android.view.View$1.onClick(View.java:3093)
05-22 09:07:20.900: E/AndroidRuntime(26699): ... 11 more
05-22 09:07:20.900: E/AndroidRuntime(26699): Caused by: java.lang.StackOverflowError
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.util.HashMap.get(HashMap.java:298)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectStreamClass.getReflectionField(ObjectStreamClass.java:190)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:953)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.util.ArrayList.writeObject(ArrayList.java:644)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invoke(Method.java:511)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectO
</code>

Weiß jemand woran das liegt?

Gruß

Antworten
  • Forum-Beiträge: 1.727

22.05.2014, 09:29:30 via Website

Du hast andere logik in dem Fall wie es aussieht:

05-22 09:07:20.900: E/AndroidRuntime(26699): Caused by: java.lang.StackOverflowError
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.util.HashMap.get(HashMap.java:298)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectStreamClass.getReflectionField(ObjectStreamClass.java:190)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:953)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.util.ArrayList.writeObject(ArrayList.java:644)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 09:07:20.900: E/AndroidRuntime(26699): at java.lang.reflect.Method.invoke(Method.java:511)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

23.05.2014, 11:04:16 via Website

Weisst du überhaupt was " java.lang.StackOverflowError " das ist?
Wikipedia: http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf

So etwas kann auftreten, wenn eine Funktion sich selbst aufruft oder es aus ungeköärten gründen eine Endlisschleife gibt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 756

23.05.2014, 11:35:42 via Website

Nutzt du verschiedene Layouts? Die Fehlermeldung ist zwar seltsam aber sonst macht es keinen Sinn, dass die App am S4 läuft...

Antworten
  • Forum-Beiträge: 359

23.05.2014, 12:01:47 via Website

Also Stackoverflow:
Dazu sollte man wissen das ein Ram in 2 Bereiche aufgeteilt ist:
Der größere heißt Heap(Haufen).
Und der kleiner Stack (Stapel).

Wenn nun ein komplexes Object im Ram erzeugt wird, wird dies im Heap abgespeichert.
Desweiteren wird im Stack eine Refernzid zur ensprechenden Stelle im Heap abgelegt.
Nun hat der Stack (je nach Ram größe) nur eine gewissen Anzahl an Variabeln die er gleichzeitig Speichern kann.
Werden es zu viele, kommt der Stackoverflow excption.
Somit liegt es warscheinlich weniger an Smartphone bzw Tablet sondern eher wieviel Ram deiner Anwendung zur Verfügung steht.

Folgendes solltest du beachten:
statisch gespeicherte Variabeln werden die Komplette Laufzeit im Ram vorgehalten.
Globale Variabeln werden nur solange vorbehalten wie eine Klasse referenziert wird.
methoden Variabeln leben nur solange wie die Mehtode im Abarbeitungsstatus ist.
der GC (Garbige Collector) räumt das ganze auf.

Somit solltest du deinen Code bzg. benötigter Variabeln, nochmal überarbeiten.

Nachtrag:
Wenn du grad dabei bist Object aus einen Stream zu laden / zu speichern, schau dir die Methode Flush an .

Gruß
Fabian

— geändert am 23.05.2014, 12:03:37

Antworten
  • Forum-Beiträge: 222

23.05.2014, 21:28:41 via Website

Versuche es auch so: :D
Ohh my god,

aus der log ist zu entnehmen: -> Caused by: java.lang.StackOverflowError
StackOwerflowError wird ausgeworfen (bedeutet) wenn der Stack "überläuft". Weil ich nicht vermute das ..... -> vermute ich eine Rekursion.
(wie der Pascal es auch schon angedeutet hat!)
Oft wird StackOwerflowError generiert, wenn eine Methode rekursiv aufgerufen wird und irgendwas mit Parametern nicht stimmt oder keine Endbedienung existiert.
Was das bedeutet?:
Ein Paradenbeispiel:

protected void onCreate(Bundle savedInstanceState) {
...
mache_wasMethode(...);
...

public void mache_wasMethode(int x, String str_z) {

mache_wasMethode(...);

}

in der onCreate Method wird eine mache_wasMethode(...) aufgerufen.
In der mache_wasMethode(...) wird die selbe Methode aufgerufen.
Weil in oberen Beispiel jedoch keine weitere "Sachen" implementiert sind,
wird einfach die StackOverflowError Extension ausgeworfen mit dem Fatalen Abbruch der JVM (?Dalvick)

Du musst einfach in deinem Code nach vergleichbare "Code- Konstellation" suchen. Es muss nicht unbedingt in der onCreate Methode sein!
(Wenn Du jetzt denkst; - Rekursion ist was schlimmes - NO! Ohne dieses werde z.B. ein Verzeichnisinhalt unmöglich darzustellen - durchsuchen .... )

LG
Georg

— geändert am 23.05.2014, 21:33:22

Sorry für Gramatik & Stilistik Fehler.

Antworten
  • Forum-Beiträge: 14

24.05.2014, 17:03:58 via Website

Fabian Simon

Also Stackoverflow:
Dazu sollte man wissen das ein Ram in 2 Bereiche aufgeteilt ist:
Der größere heißt Heap(Haufen).
Und der kleiner Stack (Stapel).

Wenn nun ein komplexes Object im Ram erzeugt wird, wird dies im Heap abgespeichert.
Desweiteren wird im Stack eine Refernzid zur ensprechenden Stelle im Heap abgelegt.
Nun hat der Stack (je nach Ram größe) nur eine gewissen Anzahl an Variabeln die er gleichzeitig Speichern kann.
Werden es zu viele, kommt der Stackoverflow excption.
Somit liegt es warscheinlich weniger an Smartphone bzw Tablet sondern eher wieviel Ram deiner Anwendung zur Verfügung steht.

Folgendes solltest du beachten:
statisch gespeicherte Variabeln werden die Komplette Laufzeit im Ram vorgehalten.
Globale Variabeln werden nur solange vorbehalten wie eine Klasse referenziert wird.
methoden Variabeln leben nur solange wie die Mehtode im Abarbeitungsstatus ist.
der GC (Garbige Collector) räumt das ganze auf.

Somit solltest du deinen Code bzg. benötigter Variabeln, nochmal überarbeiten.

Nachtrag:
Wenn du grad dabei bist Object aus einen Stream zu laden / zu speichern, schau dir die Methode Flush an .

Gruß
Fabian

Vielen dank für diese Hinweise, ich werde mal google und mir das genauer anschauen.

Georg C.

Versuche es auch so: :D
Ohh my god,

aus der log ist zu entnehmen: -> Caused by: java.lang.StackOverflowError
StackOwerflowError wird ausgeworfen (bedeutet) wenn der Stack "überläuft". Weil ich nicht vermute das ..... -> vermute ich eine Rekursion.
(wie der Pascal es auch schon angedeutet hat!)
Oft wird StackOwerflowError generiert, wenn eine Methode rekursiv aufgerufen wird und irgendwas mit Parametern nicht stimmt oder keine Endbedienung existiert.
Was das bedeutet?:
Ein Paradenbeispiel:

protected void onCreate(Bundle savedInstanceState) {
...
mache_wasMethode(...);
...

public void mache_wasMethode(int x, String str_z) {

mache_wasMethode(...);

}

in der onCreate Method wird eine mache_wasMethode(...) aufgerufen.
In der mache_wasMethode(...) wird die selbe Methode aufgerufen.
Weil in oberen Beispiel jedoch keine weitere "Sachen" implementiert sind,
wird einfach die StackOverflowError Extension ausgeworfen mit dem Fatalen Abbruch der JVM (?Dalvick)

Du musst einfach in deinem Code nach vergleichbare "Code- Konstellation" suchen. Es muss nicht unbedingt in der onCreate Methode sein!
(Wenn Du jetzt denkst; - Rekursion ist was schlimmes - NO! Ohne dieses werde z.B. ein Verzeichnisinhalt unmöglich darzustellen - durchsuchen .... )

LG
Georg

Das klingt ja ähnlich wie eine Endlosschleife. Da ich aber sowas nicht in meinem quelltext habe kann es ja daran nicht liegen oder?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

24.05.2014, 17:07:05 via Website

Ab besten du benutzt nun den Debugger und prüfst bis zu welcher Position dieser kommt, bevor die Exception kommt.
somit kannst du schon andere Teile deines Codes ausschließen.
Sobald du das Gebiet des Fehler eingegrenzt hast, suchst du dort weiter oder du postest ihn hier im Forum.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 756

24.05.2014, 17:10:03 via Website

Hab schon einmal gefragt - benutzt du verschiedene Layouts?

Antworten
  • Forum-Beiträge: 14

24.05.2014, 18:41:03 via Website

Martin

Hab schon einmal gefragt - benutzt du verschiedene Layouts?

Nein es ist das selbe layout.

Edit:

Mittels debugger hab ich jetzt herausgefunden das es immer auftritt wenn startactivity(intent); aufgerufen wird.
Ich hab meine app jetzt sofern es mir möglich war verbessert z.b. weniger listen und variablen. Sie arbeitet gefühlt auch besser aber frisst dennoch ganz schön viel RAM. Fängt mit 30MB an und steigert sich bei benutzung bis 120MB.

— geändert am 24.05.2014, 22:02:09

Antworten
  • Forum-Beiträge: 756

25.05.2014, 00:30:33 via App

Poste mal das Fragment vom Aufruf dann ist es vermutlich einfacher dir zu helfen - was mich wundert ist, dass es am S4 läuft und am Tablet nicht obwohl beide Geräte ähnlich gute Hardware haben

...deshalb auch meine Vermutung, dass irgendetwas mit dem Layout nicht stimmt - oder greifst du eventuell auf eine Telefonfunktion zu, die beim Tablet nicht vorhanden ist?

Antworten
  • Forum-Beiträge: 14

25.05.2014, 12:17:50 via Website

Martin

Poste mal das Fragment vom Aufruf dann ist es vermutlich einfacher dir zu helfen - was mich wundert ist, dass es am S4 läuft und am Tablet nicht obwohl beide Geräte ähnlich gute Hardware haben

...deshalb auch meine Vermutung, dass irgendetwas mit dem Layout nicht stimmt - oder greifst du eventuell auf eine Telefonfunktion zu, die beim Tablet nicht vorhanden ist?

hier das fragment:

&lt;ScrollView xmlns:android=&quot;schemas.android.com/apk/res/android&quot;
    xmlns:tools=&quot;schemas.android.com/tools&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;fill_parent&quot;
    android:paddingBottom=&quot;@dimen/activity_vertical_margin&quot;
    android:paddingLeft=&quot;@dimen/activity_horizontal_margin&quot;
    android:paddingRight=&quot;@dimen/activity_horizontal_margin&quot;
    android:paddingTop=&quot;@dimen/activity_vertical_margin&quot;
    android:background=&quot;#293c4b&quot; &gt;

    &lt;LinearLayout
        android:id=&quot;@+id/ll&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:orientation=&quot;vertical&quot; &gt;

    &lt;/LinearLayout&gt;

&lt;/ScrollView&gt;

Das Fragment ist so leer weil ich die TextViews aus Designgründen mit Code hinzufüge. Es wird dann insgesamt eine Liste angezeigt mit X Items, je nachdem wie groß die ArrayList ist. Ein onClick Event gibt es für jedes Item. 90% der Items kann ich anklicken und ein neues View öffnet sich mit Infos zu dem Item. Allerdings bei den anderen 10% stürzt die App mit dem Stackoverflowerror ab. Unabhängig davon ob ich zuerst funktionierende Items öffne oder zuerst ein abstürzendes Item öffnen möchte. Unterschiede zwischen den Items sind nur minimal. z.B. anderer R.string oder anderes R.drawable.

Und wie schon erwähnt, auf meinem Galaxy S4 klappt alles ohne Probleme. Beide Geräte haben genug RAM. Ich habe die App gestern noch mehrere male versucht umzuschreiben und eine Lösung zu finden z.B. den Gebrauch von static zu vermeiden, Globale variablen verringert, alles in allem mehr dynamisch gemacht mit Vererbung.

Ein anderen Gedankengang den ich hatte war das ich zu viele TextViews habe, was aber auch nicht sein kann weil diese erst mit der Laufzeit beim Anzeigen des Items erzeugt werden.

Es ist mir auch nicht bekannt warum genau diese bestimmten Items abstürzen, wie oben schon angemerkt haben die nur andere R.string und R.drawable, und auf meinem Smartphone läuft es ja. Aber es sind immer die selben Items.

— geändert am 25.05.2014, 12:31:03

Antworten
  • Forum-Beiträge: 359

26.05.2014, 08:21:51 via Website

Dann zeig uns bitte mal den Code wo du den Icon einen OnClickListener hinzufügst.

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

26.05.2014, 18:31:14 via App

Schau dir mal ListViews an. Ich hab gehört, dass die nicht so viel RAM brauchen.

Antworten
  • Forum-Beiträge: 14

26.05.2014, 23:24:57 via Website

Nick Reitemeyer

Schau dir mal ListViews an. Ich hab gehört, dass die nicht so viel RAM brauchen.

Schön das du das gehört hast, aber ich kann mich schlecht darauf verlassen wenn du es nur gehört hast.

Fabian Simon

Dann zeig uns bitte mal den Code wo du den Icon einen OnClickListener hinzufügst.

    private void ShowList(ArrayList&lt;ItemProperties&gt; al) {

    for (final ItemProperties o : al) {
        //Itemproperties hat informationen wie name und picture
        MyTextView mtv; //MyTextView(context,string,picture,pictureposition,picturesize,textunderline,paddingtop)
        LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
        mtv = new MyTextView(this, getString(o.getName()), o.getPicture(), &quot;left&quot;, 3, false, 0);
        mtv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Intent intent = new Intent(ListActivity.this, ItemView.class);
                    Bundle b = new Bundle();
                    b.putSerializable(&quot;key&quot;, o);
                    intent.putExtras(b);
                    startActivity(intent);
            }
        });
        ll.addView(mtv);


    }

}

Antworten
  • Forum-Beiträge: 359

27.05.2014, 07:06:41 via Website

Folgende fragen: befindet sich die Methode in der Klasse ltemview? Vermutlich nicht oder?
Tipps: wenn du eine Liste darestellen willst sollest du wirklich ein listview nehmen !
Was du aufjedenfall machen solltest, ist das auslagern des onclicklisteners aus der Schleife heißt: lege vor der Schleife mit

View.Onclicklistener klick = New onclick....

Den listener an und in der Schleife setzt du mit setonclick...(klick) immer auf die selbe Referenz.

Weiß nicht ob es dein Problem löst aufjedenfall ist es Ressourcensparender

Auch LinearLayout ll = (LinearLayout) findViewById(R.id.ll); solltest du vor die Schleife setzten.
Also ingesamt so:

  private void ShowList(ArrayList&amp;lt;ItemProperties&amp;gt; al) {
        LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
View.OnClickListener klick = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        Intent intent = new Intent(ListActivity.this, ItemView.class);
                        Bundle b = new Bundle();
                        b.putSerializable(&amp;quot;key&amp;quot;, o);
                        intent.putExtras(b);
                        startActivity(intent);
                }
            }

    for (final ItemProperties o : al) {
        MyTextView mtv = new MyTextView(this, getString(o.getName()), o.getPicture(), &amp;quot;left&amp;quot;, 3, false, 0);
        mtv.setOnClickListener(**klick**);
        ll.addView(mtv); 
    }

}

So in etwa...

— geändert am 27.05.2014, 08:13:41

Antworten
  • Forum-Beiträge: 14

27.05.2014, 11:18:16 via Website

Ich würde nur ungern auf ListView umsteigen da ich bisher immer Probleme mit denen hatte. Außerdem benutze ich TextViews welche auf der Linken seite ein Bild zu dem Item anzeigen. Ob ich nun eine ListView mit einem neuen layout befülle welches ein Textview mit einem Bild hat oder ein LinearLayout in einem ScrollView habe welche ich mit Textviews befülle kann ja eigentlich kann doch eigentlich kein großer unterschied sein?

Das mit dem OnClickListener nicht in der schleife hat leider nicht geklappt. Bekomme immer noch den Stackoverfloweror.

— geändert am 27.05.2014, 11:22:11

Antworten
  • Forum-Beiträge: 359

27.05.2014, 11:40:54 via Website

Du hast diese Frage noch nicht beantwortet:
befindet sich die Methode in der Klasse ltemview? Vermutlich nicht oder?
Ich glaube auch das du ein rekurionsproblem hast.
Allerdings ein sehr verstecktest....
Ich vermute, das du mit dem Intent aufruf die Klassen immer und immer wieder aufrufst. halt wie bei einer Rekusion.
Dies würde zutreffen wenn der Stackoverflow nur dann käme, wenn du schon ein paar elemente angeklickt hattest.
so nach dem motto bis zum xten TextView gehts und dann kommt bei element y das exception

Antworten

Empfohlene Artikel