2016-03-30 11 views
1

テキストビューテキストを数回更新しようとしていますが、最後のテキストのみが画面に表示されます。私は基本的にテキストの外観を遅らせて、ユーザーがメッセージを読む時間を得たいと思っています。以下は私が試したコードスニペットです。親切にガイドします。私はxamarinを使用しています。数秒間でTextviewテキストを複数回更新する

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"; 
      }); 
     }); 
    } 
} 

上記のコードは、テキスト "START" を表示した後、(2 + 2 + 2 + 2 = 8)秒間スリープした後(BYE BYE)のみ最後のテキストを表示します。親切にガイドします。

答えて

0

あなたはUIスレッド上で更新テキストとThread.Sleepを実行し、それはすぐに行くので、UIが変更自体を受けていない、このよう

setText()方法で
new CountDownTimer(8000, 1000) { 

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

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

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

を私はC#(monodroid/xamarin) –

+0

おおを使用しています。私はそれに慣れていないが、彼らの代わりに 'CountDownTimer'ですか? –

+0

@OvaisKhan私はこの方法も見つけました(https://developer.xamarin.com/api/type/Android.OS.CountDownTimer)。それのサンプルを取る。この同じロジックを使用します。 –

0

を実行します。その最後のテキスト更新の後、UIは制御を受け取り、それ自身を更新する。あなたがTimerとあなたのテキストを更新するには(あなたが使用することは非常に簡単で、いくつかのオプションが、それらのすべてを持っている。それをグーグル)またはバックグラウンドで更新し、待機(Thread.Sleep)を行う必要がある更新テキスト(経由を表示するには

たとえばTask)、更新要求をUIに送信します。

あなたがUI以外のスレッドからUIを更新する場合は、Send \ Postで直接実行する必要があります。 (Dispatcher.Invoke \ BeginInvokeでWPFまたは他のプラットフォームの他の同期コンテキストをチェックしてください)。

(あなたが任意の具体的な例をしたい場合は、コメントしてください、フォームのバリエーションの可能性を選択することができますので、私は特定の実装を与えることはありません)

1

はasnyc /の電源を使用してくださいそれはあなたのUIが応答し続ける:)待ちますコンテキストを保存するため、UIスレッドに手作業で戻す必要はありません。

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

次のように私は、スヴェン・マイケルSTUBEの答え@試してみました:

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); 
       } 
      } 
関連する問題