我尝试多次更新textview文本,但屏幕上只显示最后一个文本。我基本上想延迟文本外观,以便用户有时间阅读消息。以下是我尝试过的代码段。请指导。我正在使用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";
});
});
}
}
上面的代码显示文本“START”,然后睡眠(2 + 2 + 2 + 2 = 8)秒,然后只显示最后一个文本(BYE BYE)。请指导。
答案 0 :(得分:1)
使用asnyc / await的强大功能:)它可以保持您的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";
}
答案 1 :(得分: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
}
答案 2 :(得分:0)
您在UI线程上运行更新文本和Thread.Sleep
,因此UI本身不会收到更改,因为它会立即进入睡眠状态,在最后一次文本更新后,UI会接收控件并自行更新。
要查看更新文字,您需要使用Timer
更新文字(您有多个选项,所有这些选项都非常简单易用。只需google)或进行更新和等待({{1在后台(例如,通过Thread.Sleep
),并将更新请求发送到UI。
请记住,如果您从非UI线程更新UI,则需要使用Send \ Post而不是直接执行此操作。 (检查Dispatcher.Invoke \ BeginInvoke for WPF或其他平台的其他同步上下文)。
(我没有给出具体的实施,因为您可以选择表格变体的可能性,如果您想要任何具体的例子,请发表评论)
答案 3 :(得分:0)
我试过@ Sven-MichaelStübe回答如下:
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);
}
}