Merkwürdiges Verhalten mit TextView

  • Heyho ihr,


    ich muss ja leider beichten, dass mich ein Problem zu eucht geführt hat; ich habe es vorher schon bei der entsprechenden Google-Gruppe versucht, aber die Herren brauchen länger als 24 Stunden, um mein Thema freizuschalten, was mir in die für mich gelegte Deadline ( der 31.04. ) überhaubt nicht passt :-[


    Mein Problem ist, dass ich den Inhalt von einem EditText in ein TextView schreiben muss; klingt recht einfach, funktioniert nur nicht so, wie es soll. Das Konzept ist in etwa so:

    • Der Benutzer hat einen TextView
    • Nach dem Klick darauf, öffnet sich ein AlertDialog mit einem EditText
    • Wenn der Benutzer den AlertDialog absendet, wird der Inhalt des EditText's in in den TextView gschrieben.

    Es funktioniert auch alles so weit, ich kann nach dem Absenden des AlertDialoges alles in den TextView schreiben, nur nicht dass, was im EditText steht.


    Ein bischen Code...

    Das ganze fügt das Layout profile_item ( bestehend aus 2 TextViews: profile_item_key und profile_item_value ) ein, setzt den Inhalt von Key und Value und legt einen OnClickListener auf das Value-Feld. Wird das geklickt, wrd folgende Code ausgeführt:

    Wie man hier auch sieht, habe ich verschiedenes versucht, um das zu "fixxen".


    Bei Versuch 1 habe ich erst einfach mal geguckt, ob der EditText ( Variable: et ) und der TextView ( Variable: tv ) existieren. Tun sie auch, sind beides gültige Resourcen.
    Versuch 2 zeigt, wie ich versucht habe, einen neuen String zu erstellen, weil meine Vermutung dann dabei lag, dass vielleicht Pointer genutzt werden, der EditText am Ende der Funktion vielleicht vom Garbarage-Collector erwischt wird und dann weg ist.
    Im Versuch 3 habe ich das Setzen explizit in den UI-Thread gesetzt, weil ich dann vermutete, dass der OnClickListener ( warum auch immer ) vielleicht in einem neuen Thread gepackt wird. Auch das hat nicht funktioniert.
    Versuch 4 war denn ein Versuch, ob ich den richtigen TextView habe - habe ich, er hat erfolgreich "555" in den TextView geschrieben.
    Letztenendes habe ich versucht, anders auf den Editable zuzugreifen, indem ich alles zuerst in einen Char-Array kopiert habe, und das dann in einen String gepackt habe; guess what, es ging nicht.
    Ich kann den Inhalt auch nicht per tv.setText(et.getText().toString()) setzen, allerdings gibt Log.d("OUTPUT", et.getText().toString()) den Inhalt richtig aus.


    Ich habe echt keine Ahnung mehr, was ich versuchen könnte, und währe sehr erfreut, wenn jemand mir vielleicht auch nur eine Idee geben könnte;


    Tion

  • Das ist von der Theorie her eine geniale Idee, das zu debuggen, werde ich mir merken.



    Ausgabe:

    Code
    04-09 01:17:14.959: D/otChanged(32046): T
    04-09 01:17:14.959: D/otAfterChanged(32046): T
    04-09 01:17:20.939: D/otBeforeChanged(32046): T
    04-09 01:17:20.939: D/otChanged(32046): Te
    04-09 01:17:20.939: D/otAfterChanged(32046): Te
    04-09 01:17:23.469: D/otBeforeChanged(32046): Te
    04-09 01:17:23.469: D/otChanged(32046): Tex
    04-09 01:17:23.469: D/otAfterChanged(32046): Tex


    Also kommt der eingegebene Text ( in diesem Fall "Tex" ) 100%ig auch an den EditText an; aber er kann trotzdem nicht in den TextView geschrieben werden...


    Ich kann ja noch mal alles posten, was mir gerade aus LogCat unter die Finger kommt; Log-Level ist "debug"



    Habe ich noch nicht gepostet, fällt mir auf;


    Getestet wird über USB auf meinem Motorola Motoluxe ( XT-615 ) und Android 2.3.7
    IDE ist Eclipse, Handy ist gerootet, App läuft aber nicht als Root.

  • Ich würde mal noch probieren die Definition des EditTextes nicht innerhalb deiner changeText Methode zu machen, sondern schon mal ausserhalb (globaler) zu definieren, nicht das es hier zu merkwürdigen Effekten kommt. Du nutzt ja eh immer die selbe Instanz (zumindest versuchst du das)


    also irgendwo oben in deiner Mainactivity

  • Habe das jetzt mal so gemacht:

    Dann wieder das Erstellen des OnClickListeners, hat sich nichts dran geändert


    Das, was mich daran am meisten verwirrt, ist ja, dass ich den Inhalt vom EditText ausgeben kann ( und der wird richtig ausgegeben ) und ich kann den Inhalt vom TextView mit "statischen" Texten ( also keine Variablen enthalten ) verändern. Selbst innerhalb der OnClick-Methode des AlertDialoges...


    Eine Alternative, zu der ich jedoch ungerne greifen möchte, währe, anstelle des TextViews ein EditText direkt da rein zu "klatschen" - das sieht aber nicht schön aus, da ich nur weniger als die Hälfte des Bildschirmes ( Portrait mode ) habe.

  • Ich kann den Inhalt auch nicht per tv.setText(et.getText().toString()) setzen, allerdings gibt Log.d("OUTPUT", et.getText().toString()) den Inhalt richtig aus.


    Das klingt ausgesprochen verwunderlich.
    Dir stürzt dabei auch nix ab oder so?
    Bau doch bitte mal ein kleines Testprojekt, dass nur aus den nicht funktionierenden Teilen besteht und lad das hier hoch.
    Dann schau ich mir gern mal das Gesamtkonstrukt an. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Tion,
    ich habe es auch schon hin und wieder beobachte, dass ich in einer
    onClick() Methode "seltsame" Ergebnisse hatte, so dass etwas nicht ausgeführt wurde.
    Wenn ich jedoch dann statt einer Aktion darin wie etwa

    Zitat

    active_value.setText(active_et.getText().toString());

    einfach nur eine andere Methode aufrief, etwa

    Zitat

    active_builder.setPositiveButton(getString(R.string.profile_edit_save), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    Schreibrein(active_et.getText().toString())
    }
    });

    dann ging es. Dabei könnte dann Schreibrein() in etwa so aussehen:

    Zitat

    void Schreibrein(String ueber)
    {
    active_value.setText(ueber);
    }

    Falls das auch nicht klappen sollte, so musst dus halt in eine globale Variabel schreiben.
    Oder noch besser, das Angebot von Lucas de Vil annehmen.


    Schöne Grüße, schymura ^^


  • Das klingt ausgesprochen verwunderlich.
    Dir stürzt dabei auch nix ab oder so?
    Bau doch bitte mal ein kleines Testprojekt, dass nur aus den nicht funktionierenden Teilen besteht und lad das hier hoch.
    Dann schau ich mir gern mal das Gesamtkonstrukt an. :)

    Das ist ja witzig; in dem Testprojekt geht alles ?
    Ich lade das trotzdem mal hoch, damit der Zusamenhang klar wird - https://dl.dropbox.com/u/58558990/src.zip


    Das ist in etwa die App, nur, dass ich in den Layouts den Kopfbereich auskommentiert habe ( weil der wieder aus 3 Layouts besteht und von einer eigenen Klasse behandelt wird, [...] ) und der Zugriff auf den Webserver wegfällt.


    Werde jetzt mal hier und da ein paar Sachen bei meiner App wegstreichen und testen, ob das geht.


    schymura: Das mit der extra Methode hat auch nicht geklappt; und globale Variablen kann ich wohl nicht nehmen, da ich beim Programmieren nicht weiß, um wie viele TextView's es sich handelt, und ich diese später dann auch wieder auslesen muss und an den Server "zurückfunken" muss...
    Sonst zur Not könnte ich trotzdem auch noch eine Variable "zwischenklemmen", allerdings hilft mir das nicht weiter, wenn der benutzer nicht sieht, dass das Feld auch wirklich bearbeitet wurde...

  • Das ist ja witzig; in dem Testprojekt geht alles ?


    'Alles' würde ich jetzt nicht sagen, wenn ich mehr als einmal irgendwo hin tippe stürzt es mir ab. ;)
    Aber die Übergabe funktioniert einwandfrei. Das ist leider oftmals so. Man baut in seinem Hauptprojekt alles Mögliche ein, zweifelt an dem ganzen System, testet in einem Projekt seinen Ansatz, stellt die Funktionalität fest und spontan fällt einem auf, wo das Problem eigentlich lag. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Das habe ich gerade schon behoben; hing damit zusammen, dass ich alles golbalisiert hatte, und ich dachte schon, ich hätte den Bug damit weg, aber...


    Ich bin jetzt so weit, dass es funktioniert, weil ich das "onResponse" einfach in keiner anderen Funktion drinne habe... Aber wenn ich es bei einem AsyncTask unter "onPostExecute" ausführe, geht es nicht; selbst wenn ich noch ein "runOnUIThread" dazwischen setze... Ich vermute, dass ich den ActivityContext o.ä. verliere, während ich die Schritte durchgehe, aber warum ?


    Das Response-Listener-Interface sieht so aus:

    Java
    package de.tionsys.internet;
    
    
    public interface ResponseListener {
    	public void onResponse(String response);
    	public void onError(Exception error);
    }

    Und der Zugriff auf den AsyncTask:

    Was mich verwirrt, ist, dass alles geht, wenn ich das Activity.onResponse direkt in der onCreate-Methode aufrufe, wie ich es in dem Debug-Projekt oben getan habe - wenn ich es aber so mache, geht es nicht.


    ProfileRequestTask sieht nicht exact so aus, sondern etwas anders; habe das ganze mal so kopiert, wie es ausgeführt werden würde. Dabei hat sich nur das "doInBackground" geändert.


    Ich weiß leider nicht, was ich hier übersehe... Ich lasse den doch noch mal extra im UI-Thread laufen...


    Edit: Ich habe jetzt noch ein bischen rumprobiert und bin dabei zu der Feststellung gekommen, dass, wenn ich anstelle des TextViews einen EditText nehme, dieser einen "Schreibschutz" hat - bedeutet, man kann den Inhalt nicht ändern.
    Finde es etwas blöd, wenn wir uns jetzt hier von dem eigentlichen Thema so weit "distanzieren", markiere das deswegen als "erledigt", teste noch ein bischen rum und frage zur Not in einem neuen Thread zum passendem Thema nach.
    Danke an alle, die versucht haben zu helfen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!