wie man Text in Android TextView ändert

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 taucht nur der zweite Text auf, wenn ich ihn leite. Ich denke, es könnte etwas mit der Thread.sleep() der Thread.sleep() -Methode zu tun haben. Kann mir also jemand zeigen, wie man einen Timer “asynchron” implementiert?

Vielen Dank.

Solutions Collecting From Web of "wie man Text in Android TextView ändert"

Ich habe diese Antwort gerade in der android-discuss google-Gruppe veröffentlicht

Wenn du nur versuchst, der Ansicht Text hinzuzufügen, so dass “Schritt eins: t.appendText("Step Two: fry egg"); Ei Schritt zwei: brate Ei” t.appendText("Step Two: fry egg"); dann erwäge t.appendText("Step Two: fry egg"); anstelle von t.setText("Step Two: fry egg");

Wenn Sie das, was in der TextView ist, komplett ändern wollen, so dass es beim Start “Schritt Eins: Ei sprengen” TextView und dann “Schritt Zwei: Ei frittieren” zu einem späteren Zeitpunkt heißt, können Sie immer eine verwenden

Runnable Beispiel Sadboy gab

Viel Glück

Ihre onCreate() -Methode hat mehrere große Fehler:

1) onCreate bereitet Ihre Aktivität vor – also wird nichts, was Sie hier tun, für den Benutzer sichtbar gemacht , bis diese Methode beendet ist! Zum Beispiel – Sie werden den Text eines TextView niemals mehr als einmal ändern TextView , 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: Thread.sleep() niemals Thread.sleep() oder Thread.wait() in deinem Haupt-Thread, der für deine UI verantwortlich ist! (Weitere Informationen finden Sie unter “Halten Sie Ihre App Responsive” )

Was Ihre Initialisierung Ihrer Aktivität ist, ist:

  • aus keinem Grund erstellen Sie ein neues TextView Objekt t !
  • Sie wählen später die TextView Ihres Layouts in der Variablen t .
  • Sie setzen den Text von t (aber denken Sie daran: Es wird erst angezeigt, onCreate() beendet ist und die Hauptereignisschleife Ihrer Anwendung ausgeführt wird!)
  • Sie warten 10 Sekunden innerhalb Ihrer onCreate Methode – dies darf niemals gemacht werden, da es alle UI-Aktivitäten stoppt und definitiv eine ANR (Anwendung reactjs nicht, siehe Link oben!)
  • dann legen Sie einen anderen Text fest – dieser wird angezeigt, sobald Ihre onCreate() -Methode beendet und mehrere andere Aktivitätslebenszyklus- Methoden verarbeitet wurden!

Die Lösung:

  1. Setze Text nur einmal in onCreate() – dies muss der erste Text sein, der sichtbar sein soll.

  2. Erstellen Sie einen Runnable und einen Handler

     private final Runnable mUpdateUITimerTask = new Runnable() { public void run() { // do whatever you want to change here, like: t.setText("Second text to display!"); } }; private final Handler mHandler = new Handler(); 
  3. installiere diesen Runnable als Handler, möglich in onCreate() (aber lies meinen Rat unten):

     // run the mUpdateUITimerTask's run() method in 10 seconds from now mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000); 

Hinweis: Vergewissern Sie sich, dass Sie den Lebenszyklus einer Activity kennen! Wenn Sie so etwas in onCreate() , geschieht dies nur, wenn Ihre Activity das erste Mal erstellt wird! Android wird möglicherweise Ihre Activity für einen längeren Zeitraum am Leben erhalten, auch wenn es nicht sichtbar ist! Wenn ein Benutzer es wieder “startet” – und es ist noch vorhanden – werden Sie Ihren ersten Text nicht mehr sehen!


=> Installiere Handler immer in onResume() und deaktiviere sie in onPause() ! Andernfalls erhalten Sie “Updates”, wenn Ihre Activity nicht sichtbar ist! Wenn Sie Ihren ersten Text bei der Reaktivierung wieder sehen möchten, müssen Sie ihn in onResume() , nicht onCreate() !

Die erste Zeile der neuen Textansicht ist nicht erforderlich

 t=new TextView(this); 

Du kannst das einfach tun

 TextView t = (TextView)findViewById(R.id.TextView01); 

Soweit ein Hintergrund Thread, 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 mit einem Timer statt http://android-developers.blogspot.com/2007/11/stitch-in-time.html

  Thread thr = new Thread(mTask); thr.start(); } Runnable mTask = new Runnable() { public void run() { // just sleep for 30 seconds. try { Thread.sleep(3000); runOnUiThread(done); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Runnable done = new Runnable() { public void run() { // t.setText("done"); } }; 

@ user264892

Ich habe festgestellt, dass ich bei der Verwendung einer String-Variablen entweder eine Zeichenfolge von “” voranstellen oder explizit an CharSequence übergeben musste.

Also statt:

 String Status = "Asking Server..."; txtStatus.setText(Status); 

Versuchen:

 String Status = "Asking Server..."; txtStatus.setText((CharSequence) Status); 

oder:

 String Status = "Asking Server..."; txtStatus.setText("" + Status); 

oder, da deine Saite nicht dynamisch ist, noch besser:

 txtStatus.setText("AskingServer..."); 

Ich benutze Handle und Runnables, um den Inhalt des TextView mit einem “Timer” zu ändern. Aus irgendeinem Grund überspringt die App beim Laufen immer den zweiten Schritt (“Zweiter Schritt: Frittierei”) und zeigt nur den letzten (dritten) Schritt (“Schritt drei: Ei servieren”).

 TextView t; private String sText; private Handler mHandler = new Handler(); private Runnable mWaitRunnable = new Runnable() { public void run() { t.setText(sText); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMonster = BitmapFactory.decodeResource(getResources(), R.drawable.monster1); t=new TextView(this); t=(TextView)findViewById(R.id.TextView01); sText = "Step One: unpack egg"; t.setText(sText); sText = "Step Two: fry egg"; mHandler.postDelayed(mWaitRunnable, 3000); sText = "Step three: serve egg"; mHandler.postDelayed(mWaitRunnable, 4000); ... } 

🙂 Ihr benutzt den Thread falsch. Mach einfach folgendes:

 private void runthread() { splashTread = new Thread() { @Override public void run() { try { synchronized(this){ //wait 5 sec wait(_splashTime); } } catch(InterruptedException e) {} finally { //call the handler to set the text } } }; splashTread.start(); } 

Das ist es.

Setzen Sie den Text zweimal auf sam textview, um den ersten geschriebenen Text zu überschreiben. Beim zweiten Mal, wenn wir settext verwenden, fügen wir einfach die neue Zeichenfolge an

 textview.append("Step Two: fry egg"); 

@Zordid @Iambda Antwort ist großartig, aber ich habe das gefunden, wenn ich es stelle

 mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000); 

in der run () -Methode und

 mHandler.postDelayed(mUpdateUITimerTask, 0); 

In der OnCreate-Methode soll das Ding weiter updaten.