如何在使用片段和计时器的选项卡 activity 上更新 UI
how to update UI on a tabbed activity which uses fragments and timers
我有一个带标签的 activity,其中包含 3 个片段。第一个片段允许用户 select 测试,第三个片段有一个计时器和一个文本视图以及一些按钮。第二个片段现在什么都没有。
在片段 3 中,我有一个启动计时器的按钮,一旦计时器启动,textview 每分钟刷新一次,显示经过的时间。到目前为止一切正常。
问题:如果我 select 片段 1 和 return 回到片段 3,一旦计时器启动,计时器就会停止更新 textView。我知道 timer_elapsed 正确地 运行 只有 textview 没有更新。
我试过了FragmentActivity.RunOnUiThread(() => {});这工作正常,直到片段被切换。
我确实尝试使用 Loopers.MainLooper 更新屏幕,但问题仍然存在。
// update the screen every minute
if (mActivity != null)
{
mActivity.RunOnUiThread(() =>
{
// set the progress bar
progressBar.Progress = i32ProgressBarValue;
textViewPercentage.Text = i32ProgressBarValue + "%";
// set the text view
textViewTestTime.Text = $"{Globals.i32Days}" + "D :" + $"{Globals.i32Hours}" + "H :" + $"{Globals.i32Mins}" + "M";
});
}
我希望 textView 在切换片段并return返回片段 3
时继续正确更新
我编写了一个在 TabbedActivity 中使用 Timer 的示例(使用 BottomNavigationView),它也有三个片段,在第三个片段中,我使用按钮启动定时器,每两秒更新一次按钮的文本,效果很好(也可以switch fragments时),下面是第三个fragment中的代码,大家可以参考一下:
Timer _dispatcherTimer;
TimerCallback timerDelegate;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
// return inflater.Inflate(Resource.Layout.YourFragment, container, false);
View view = inflater.Inflate(Resource.Layout.fragment_account, container, false);
init(view);
timerDelegate = new TimerCallback(Tick);
return view;
}
private void init(View view)
{
button = view.FindViewById<Button>(Resource.Id.mybutton);
button.Click += delegate
{
_dispatcherTimer = new System.Threading.Timer(timerDelegate, null, 0, 2000);
};
}
private void Tick(object state)
{
this.Activity.RunOnUiThread(() =>
{
//do something
Random reRandom = new Random();
int s = reRandom.Next(1000);
button.Text = s.ToString();
});
}
我有一个带标签的 activity,其中包含 3 个片段。第一个片段允许用户 select 测试,第三个片段有一个计时器和一个文本视图以及一些按钮。第二个片段现在什么都没有。
在片段 3 中,我有一个启动计时器的按钮,一旦计时器启动,textview 每分钟刷新一次,显示经过的时间。到目前为止一切正常。
问题:如果我 select 片段 1 和 return 回到片段 3,一旦计时器启动,计时器就会停止更新 textView。我知道 timer_elapsed 正确地 运行 只有 textview 没有更新。
我试过了FragmentActivity.RunOnUiThread(() => {});这工作正常,直到片段被切换。
我确实尝试使用 Loopers.MainLooper 更新屏幕,但问题仍然存在。
// update the screen every minute
if (mActivity != null)
{
mActivity.RunOnUiThread(() =>
{
// set the progress bar
progressBar.Progress = i32ProgressBarValue;
textViewPercentage.Text = i32ProgressBarValue + "%";
// set the text view
textViewTestTime.Text = $"{Globals.i32Days}" + "D :" + $"{Globals.i32Hours}" + "H :" + $"{Globals.i32Mins}" + "M";
});
}
我希望 textView 在切换片段并return返回片段 3
时继续正确更新我编写了一个在 TabbedActivity 中使用 Timer 的示例(使用 BottomNavigationView),它也有三个片段,在第三个片段中,我使用按钮启动定时器,每两秒更新一次按钮的文本,效果很好(也可以switch fragments时),下面是第三个fragment中的代码,大家可以参考一下:
Timer _dispatcherTimer;
TimerCallback timerDelegate;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
// return inflater.Inflate(Resource.Layout.YourFragment, container, false);
View view = inflater.Inflate(Resource.Layout.fragment_account, container, false);
init(view);
timerDelegate = new TimerCallback(Tick);
return view;
}
private void init(View view)
{
button = view.FindViewById<Button>(Resource.Id.mybutton);
button.Click += delegate
{
_dispatcherTimer = new System.Threading.Timer(timerDelegate, null, 0, 2000);
};
}
private void Tick(object state)
{
this.Activity.RunOnUiThread(() =>
{
//do something
Random reRandom = new Random();
int s = reRandom.Next(1000);
button.Text = s.ToString();
});
}