2016-03-30 5 views
1

Я пытаюсь обновить текст в текстовом виде несколько раз, но только последний текст отображается на экране. Я в основном хочу отложить появление текста, чтобы пользователь получил время для чтения сообщения. Ниже приведен фрагмент кода, который я попробовал. Незлое руководство. Я использую xamarin.Обновление текста текста несколько раз с задержкой в ​​несколько секунд

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

Приведенный выше код отображается текст "СТАРТ", а затем спит (2 + 2 + 2 + 2 = 8) секунд, а затем отображает только последний текст (Bye Bye). Незлое руководство.

ответ

0

Делай так,

new CountDownTimer(8000, 1000) { 

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

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

в setText() метод

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

Вы запускаете текст обновления и Thread.Sleep в потоке пользовательского интерфейса, так что интерфейс не получить изменить себя, потому что сразу идти для сна, после этого последнего обновления текста пользовательский интерфейс получает контроль и само обновление.

Для просмотра текста обновления вам необходимо обновить текст с Timer (у вас есть несколько вариантов, все они очень просты в использовании. Просто Google его) или сделать обновление и ожидание (Thread.Sleep) в фоновом режиме (с помощью Task) и отправить запрос на обновление в пользовательский интерфейс.

Просто помните, что если вы обновляете пользовательский интерфейс от неинтерфейса, вам нужно сделать это с помощью Send \ Post, а не напрямую. (проверьте Dispatcher.Invoke \ BeginInvoke для WPF или другого контекста синхронизации для других платформ).

(я не даю конкретную реализацию, потому что вы можете выбрать возможности формы вариант, если вы хотите какой-либо конкретный пример, пожалуйста, комментарий)

1

Используйте силу asnyc/Await :) Это держит ваш пользовательский интерфейс отзывчивый и вам не нужно отправлять материал обратно в поток пользовательского интерфейса вручную, поскольку он сохраняет контекст.

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

Я пытался @ Sven-Michael 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); 
       } 
      } 
Смежные вопросы