Ich habe versucht, das zu tun
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry egg");
aber aus irgendeinem Grund wird nur der zweite Text angezeigt, wenn ich ihn ausführe. Ich denke, es könnte etwas mit der Thread.sleep()
Methodenblockierung zu tun haben . Kann mir jemand zeigen, wie man einen Timer "asynchron" implementiert?
Vielen Dank.
.setText()
angezeigt wird, ist, dass das gesamte "Widget" durch den Text ersetzt wird, den Sie festlegen sollen. EINSCHLIESSLICH Text, den Sie bereits dort abgelegt haben.Antworten:
Ich habe diese Antwort gerade in der Google-Gruppe für Android-Diskussionen gepostet
Wenn Sie nur versuchen, der Ansicht Text hinzuzufügen, sodass "Schritt Eins: Ei sprengen, Schritt Zwei: Ei braten" angezeigt wird, sollten Sie
t.appendText("Step Two: fry egg");
stattdessen anstelle von verwendent.setText("Step Two: fry egg");
Wenn Sie den Inhalt vollständig ändern möchten,
TextView
sodass beim Start "Schritt Eins: Ei sprengen" und später "Schritt Zwei: Ei braten" angezeigt wird, können Sie immer a verwendenLauffähiges Beispiel gab Sadboy
Viel Glück
quelle
Ihre
onCreate()
Methode weist mehrere große Mängel auf:1)
onCreate
bereitet Ihre Aktivität vor - so wird nichts, was Sie hier tun, für den Benutzer sichtbar gemacht , bis diese Methode abgeschlossen ist! Zum Beispiel - Sie können denTextView
Text eines Menschen hier nie mehr als EINMAL ändern, da nur die letzte Änderung gezeichnet und somit für den Benutzer sichtbar ist!2) Beachten Sie, dass ein Android-Programm standardmäßig nur in EINEM Thread ausgeführt wird! Also: Verwenden Sie niemals
Thread.sleep()
oderThread.wait()
in Ihrem Haupt-Thread, der für Ihre Benutzeroberfläche verantwortlich ist! ( Weitere Informationen finden Sie unter "Halten Sie Ihre App ansprechbar" !)Ihre Initialisierung Ihrer Aktivität bewirkt Folgendes:
TextView
objektt
!TextView
in der Variablen aust
.t
(aber denken Sie daran: Er wird erst nachonCreate()
Abschluss angezeigt und die Hauptereignisschleife Ihrer Anwendung wird ausgeführt!)onCreate
- dies darf niemals durchgeführt werden, da dadurch alle UI-Aktivitäten gestoppt werden und definitiv eine ANR erzwungen wird (Anwendung reagiert nicht, siehe Link oben!).onCreate()
Methode abgeschlossen ist und mehrere andere Methoden des Aktivitätslebenszyklus verarbeitet wurden!Die Lösung:
Stellen Sie den Text nur einmal ein
onCreate()
- dies muss der erste Text sein, der sichtbar sein soll.Erstellen Sie ein
Runnable
und einHandler
Installieren Sie diese ausführbare Datei als Handler, möglich in
onCreate()
(aber lesen Sie meinen Rat unten):Hinweis: Stellen Sie sicher, dass Sie den
Activity
Lebenszyklus eines Menschen kennen! Wenn Sie solche Dinge tun,onCreate()
geschieht dies nur, wenn SieActivity
das erste Mal erstellt werden! Android hält Sie möglicherweiseActivity
länger am Leben, auch wenn es nicht sichtbar ist! Wenn ein Benutzer es erneut "startet" - und es noch vorhanden ist - wird Ihr erster Text nicht mehr angezeigt!=> Handler immer einbauen
onResume()
und deaktivierenonPause()
! Andernfalls erhalten Sie "Updates", wenn Ihre überhauptActivity
nicht sichtbar sind! Wenn Sie in Ihrem Fall Ihren ersten Text wieder sehen möchten, wenn er erneut aktiviert wird, müssen Sie ihn festlegenonResume()
, nichtonCreate()
!quelle
Die erste Zeile der neuen Textansicht ist nicht erforderlich
Sie können dies einfach tun
Was einen Hintergrund-Thread betrifft, der hier schläft, ist ein Beispiel, aber ich denke, es gibt einen Timer, der dafür besser wäre. Hier ist ein Link zu einem guten Beispiel, bei dem stattdessen ein Timer verwendet wird: http://android-developers.blogspot.com/2007/11/stitch-in-time.html
quelle
@ user264892
Ich fand heraus, dass ich bei Verwendung einer String-Variablen entweder einen String mit dem Präfix "" voranstellen oder explizit in CharSequence umwandeln musste.
Also statt:
Versuchen:
oder:
oder, da Ihre Zeichenfolge nicht dynamisch ist, noch besser:
quelle
Gemäß Ihrem Rat verwende ich Handle und Runnables, um den Inhalt der Textansicht mithilfe eines "Timers" zu ändern. Aus irgendeinem Grund überspringt die App beim Ausführen immer den zweiten Schritt ("Schritt zwei: Ei braten") und zeigt nur den letzten (dritten) Schritt an ("Schritt drei: Ei servieren").
quelle
:) Du benutzt den Thread falsch. Gehen Sie einfach wie folgt vor:
Das ist es.
quelle
Wenn Sie den Text zweimal auf sam textview setzen, wird der erste geschriebene Text überschrieben. Wenn wir also zum zweiten Mal settext verwenden, hängen wir einfach die neue Zeichenfolge wie an
quelle
@ Zordid @ Iambda Antwort ist großartig, aber ich fand das, wenn ich sagte
in der run () Methode und
In der onCreate-Methode wird das Ding ständig aktualisiert.
quelle