2016-03-30 6 views
1

Ich versuche Texttext mehrmals zu aktualisieren, aber nur der letzte Text wird auf dem Bildschirm angezeigt. Ich möchte im Grunde die Textdarstellung verzögern, damit der Benutzer Zeit bekommt, die Nachricht zu lesen. Unten ist das Code-Snippet, das ich ausprobiert habe. Freundliche Anleitung. Ich benutze Xamarin.Texttext mehrmals mit Verzögerung von wenigen Sekunden aktualisieren

class SplashScreen : Activity 
{ 

    public SplashScreen() 
    { 

    } 

    protected override void OnCreate(Bundle bundle) 
    { 

     base.OnCreate(bundle); 
     RequestWindowFeature (Android.Views.WindowFeatures.NoTitle); 
     SetContentView(Resource.Layout.splash_screen); 


     MyTextView tv0 = FindViewById<MyTextView> (Resource.Id.BookIntro); 
     tv0.Text = "START"; 

     ThreadPool.QueueUserWorkItem(d => 
     { 

     //some code here 


     RunOnUiThread (() => { 

      tv0.Text = "HI"; 
      System.Threading.Thread.Sleep(2000); 
      tv0.Text = "HELLO"; 
      System.Threading.Thread.Sleep(2000); 
      tv0.Text = "HOW ARE YOU"; 
      System.Threading.Thread.Sleep(2000); 
      tv0.Text = "WELCOME TO ANDROID"; 
      System.Threading.Thread.Sleep(2000); 
      tv0.Text = "BYE BYE"; 
      }); 
     }); 
    } 
} 

Der obige Code angezeigter Text "Start" und dann für die Belegung (2 + 2 + 2 + 2 = 8) Sekunden und zeigt dann nur letzten Text (BYE BYE). Freundliche Anleitung.

Antwort

0

wie dies tun,

new CountDownTimer(8000, 1000) { 

public void onTick(long millisUntilFinished) { 
    setText("step"+millisUntilFinished); 
} 

public void onFinish() { 
    //Do something 
} 
}.start(); 

in setText() Methode

public void setText(String value){ 
    tv0.Text = value; //Set value to TextView here 
} 
+0

I C# bin mit (monodroid/Xamarin) –

+0

Ohh. Das ist mir nicht vertraut, aber gibt es irgendwelche Alternativen für 'CountDownTimer'? –

+0

@OvaisKhan Ich fand diese Methode auch [hier] (https://developer.xamarin.com/api/type/Android.OS.CountDownTimer). Nimm eine Probe davon. und benutze dieselbe Logik. –

0

Sie das Update Text und die Thread.Sleep auf dem UI-Thread ausgeführt werden, so dass die Benutzeroberfläche die Änderung sich nicht auf, weil es sofort gehen zu schlafen, nach dem letzten Text Update die UI erhalten Kontrolle und Update selbst.

die Aktualisierung Text zu sehen, müssen Sie Ihren Text mit Timer (Sie haben mehrere Möglichkeiten, alle von ihnen sehr einfach. Verwenden, um es einfach mal googlen) aktualisieren oder die Aktualisierung und die Warte (Thread.Sleep) im Hintergrund zu tun (über Task zum Beispiel), und senden Sie die Update-Anfrage an die Benutzeroberfläche.

Denken Sie daran, wenn Sie die UI von nicht UI-Thread aktualisieren, müssen Sie es mit Send \ Post und nicht direkt tun. (Überprüfen Sie Dispatcher.Invoke \ BeginInvoke für WPF oder einen anderen Synchronisationskontext für andere Plattformen).

(Ich habe keine bestimmte Implementierung geben, weil Sie Formularvariante Möglichkeiten wählen können, wenn Sie irgendeine spezifisches Beispiel wünschen, bitte Kommentar)

1

Nutzen Sie die Kraft von async/await :) Es hält die Benutzeroberfläche reagiert, Sie müssen die Daten nicht manuell an den UI-Thread zurücksenden, da der Kontext gespeichert wird.

protected override void OnCreate(Bundle bundle) 
{ 

    base.OnCreate(bundle); 
    RequestWindowFeature (Android.Views.WindowFeatures.NoTitle); 
    SetContentView(Resource.Layout.splash_screen); 

    UpdateTextAsync(); 
} 

private async void UpdateTextAsync() 
{ 
    MyTextView tv0 = FindViewById<MyTextView> (Resource.Id.BookIntro); 
    tv0.Text = "HI"; 
    await Task.Delay(2000); 
    tv0.Text = "HELLO"; 
    await Task.Delay(2000); 
    tv0.Text = "HOW ARE YOU"; 
    await Task.Delay(2000); 
    tv0.Text = "WELCOME TO ANDROID"; 
    await Task.Delay(2000); 
    tv0.Text = "BYE BYE"; 
} 
0

versuchte ich @ Sven-Michael Stübe Antwort wie folgt:

EditText QtyChange = FindViewById<EditText>(Resource.Id.txt_qty_change); 
this.QtyChange.TextChanged += QtyChange_TextChanged; 

private async void QtyChange_TextChanged(object sender, TextChangedEventArgs e) 
      { 
       await System.Threading.Tasks.Task.Delay(600); 

       int newQuant; 
       if (Int32.TryParse(e.Text.ToString(), out newQuant)) 
       { 
        // Update text here: 
        something.Text = newQuant 
        adapter.NotifyItemChanged(AdapterPosition); 
       } 
      } 
Verwandte Themen