如何在使用片段和计时器的选项卡式活动上更新 UI
Posted
技术标签:
【中文标题】如何在使用片段和计时器的选项卡式活动上更新 UI【英文标题】:how to update UI on a tabbed activity which uses fragments and timers 【发布时间】:2019-08-18 15:52:09 【问题描述】:我有一个带有 3 个片段的选项卡式活动。第一个片段允许用户选择一个测试,第三个片段有一个计时器、一个文本视图和一些按钮。到目前为止,第二个片段中没有任何内容。
在片段 3 中,我有一个启动计时器的按钮,一旦计时器启动,textview 会每分钟刷新一次,显示经过的时间。到目前为止一切正常。
问题:一旦计时器启动,如果我选择片段 1 并返回片段 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 在片段切换并返回片段 3 时继续正确更新
【问题讨论】:
【参考方案1】:我在 TabbedActivity(使用 BottomNavigationView)中编写了一个示例使用 Timer,它也有三个 Fragments,在第三个 Fragment 中,我使用按钮启动 Timer 以每两秒更新一次按钮的文本,它运行良好(在切换时也适用片段),下面是第三个片段中的代码,您可以参考:
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();
);
【讨论】:
感谢您的解决方案!回调计时器运行良好。我必须对代码进行一些小调整才能使其正常工作。每次我们返回片段 3 时,_dispatchedTimer 都为空,因此在 OnCreateView(..) 中的返回视图之前添加以下行使其工作:_dispatchedTimer.Dispose();和 dispatcherTimer = new System.Threading.Timer(Globals.timerDelegate, null, 0, 2000); 这样计时器间隔不会增加并且屏幕开始更新。谢谢你的帮助! 由于我们正在切换片段,因此在更新 UI 之前也添加了此检查 if (this.Activity != null) @SwathiAyas 是的,我的样本适合我的需要,应该根据自己的项目进行调整。如果对你有帮助,可以标记一下吗?谢谢!以上是关于如何在使用片段和计时器的选项卡式活动上更新 UI的主要内容,如果未能解决你的问题,请参考以下文章