【问题标题】:How to hide TimePicker and DatePicker on lifecycle events in Xamarin Forms如何在 Xamarin 表单中的生命周期事件上隐藏 TimePicker 和 DatePicker
【发布时间】:2019-07-23 15:53:08
【问题描述】:

我在 android 上遇到了一个问题,当我们导航 OnPause() 时,我们的 TimePicker 和 DatePicker 保持可见。我们需要在用户后台应用程序时将用户重定向回登录屏幕,但如果 TimePicker 或 DatePicker 在他们执行此操作时处于活动状态,它会停留在屏幕上。它出现在登录屏幕上方,按取消或确定会使应用程序崩溃。

我们正在挂钩本机 android 生命周期事件(不仅仅是使用内置挂钩的 Xamarins),并且我们重定向 OnResume()。我已经在准系统应用程序中对此进行了测试,但它仍然会发生 OnPause()。

这是导致我们出现问题的 TimePicker:

<TimePicker x:Name="VitalTimePicker" HorizontalOptions="Fill" VerticalOptions="Fill" IsVisible="false" PropertyChanged="OnTimePickerPropertyChanged"/>  

这是一个在生命周期事件中更改屏幕的示例:

protected override void OnSleep()
    {
        App.Current.MainPage = new NavigationPage(new NotesPage());
    }

有什么想法吗?我正在考虑清除拾取器,但我似乎找不到如何做到这一点

编辑

只是为了添加更多上下文

Application 类 (app.xaml.cs) 具有 lifecycle hooks,当我们的用户后台应用程序时,我们使用它来捕获。在这里,我们调用 MainPage = new NavigationPage(new LoginPage()); 将应用程序带回登录页面。

我已经添加了

protected override void OnDisappearing()  
   {
       VitalTimePicker.Unfocus();
       VitalDatePicker.Unfocus();
   }

到我正在工作的视图,它似乎在我们后台应用程序时被调用,但由于某种原因,当我们的登录页面再次弹出时,TimePicker 停留在屏幕上。

【问题讨论】:

  • 能否分享一个基本的演示,以便我们进行测试?

标签: xamarin xamarin.forms xamarin.android


【解决方案1】:

您可以使用方法Unfocus() 以编程方式关闭DatePickersTimePickers。我建议在调用下一页之前之前关闭它们,因为我不知道它们是否能够在其他屏幕初始化后被引用和关闭。

为您拥有的任何其他选择器创建一个调用VitalTimePicker.Unfocus() 的方法,并在切换到登录屏幕之前调用此方法,您应该一切顺利。

【讨论】:

  • 完美的答案,我仍然有一个问题,因为我使用OnDisappear() 来取消选择器的焦点,但我认为在 android 上它没有被调用,因为我们正在将登录屏幕添加到栈顶。你能想到的任何其他方式调用它吗?
  • @Beartooth426 你不能在调用方法将登录屏幕添加到堆栈之前取消选择器的焦点吗?
  • 我不确定是否可以将对控件的引用传递给控制生命周期事件的应用程序类
  • @Beartooth426 在您的代码中应该有一个地方可以调用 Intent 或 Xamarin 导航,以打开登录页面。不要使用任何生命周期事件,您可以在调用导致问题的页面之前取消选择器的焦点。如果您仍然有问题,请发布一些您调用登录页面的代码,以便我可以更好地帮助您。
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2015-08-07
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多