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...
final View v = getLayoutInflater().inflate(R.layout.profile_item, null);
((TextView)v.findViewById(R.id.profile_item_key)).setText(ProfileFieldTranslator.translate(key, getApplicationContext()));
try {
((TextView)v.findViewById(R.id.profile_item_value)).setText(obj.getString(key));
} catch (JSONException e) { }
((TextView)v.findViewById(R.id.profile_item_value)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v2) {
changeText(ProfileFieldTranslator.translate(key, getApplicationContext()), (TextView)v.findViewById(R.id.profile_item_value));
}
});
fields.add(new Connector(key, (TextView)v.findViewById(R.id.profile_item_key)));
((LinearLayout)convertView).addView(v);
Alles anzeigen
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:
// Dialog anzeigen: Text
public void changeText(final String title, final TextView tv) {
AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle(title);
// Den Inhalt von dem TextView ( aktuell ) in den EditText schreiben
// Write Content from TextView in EditText
final EditText et = new EditText(this);
et.setText(tv.getText());
b.setView(et);
b.setPositiveButton(getString(R.string.profile_edit_save), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// DEBUG 1: Perhaps referrer to TextView has changed ( hasn't )
//Log.d("DBG", tv.toString());
//Log.d("DBG", et.toString());
// DEBUG 2: Write it in a variable and toast it, than write that variable in the TextView ( not working )
//final String str = (" "+ et.getText().toString() +" ").trim();
//Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
// tv.setText(str);
// DEBUG 3: Starts like DEBUG2, but used the thread of UI explicit ( not working )
//runOnUiThread(new Runnable() { public void run() { tv.setText(str); } });
// DEBUG 4: Set content with no variable ( working ? :confused: )
// tv.setText("555");
// DEBUG 5: Write the content in a new String ( not working :confused:
char[] buffer = new char[et.getText().length()];
et.getText().getChars(0, buffer.length, buffer, 0);
tv.setText(new String(buffer));
}
});
b.setNegativeButton(getString(R.string.profile_edit_cancel), null);
b.create().show();
}
Alles anzeigen
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