我有一个Xamarin android应用程序,它有一个主要的片段活动(名为Home),它在视图寻呼机中托管一个视图寻呼机,然后是几个片段。
应用程序从蓝牙设备获取数据,一旦我实例化该类,它就会通过事件处理程序传递数据。
BTScanner scanner = new BTScanner();
scanner.onScanData += BTScanner_onScanData;
问题是,当页面处于活动状态时,我需要此视图分页器中的两个片段上的此事件处理程序处于活动状态。换句话说,如果我在fragment1或fragment2上,我想接收扫描数据,但是,我不能同时访问两者,有接收数据的处理和处理是不同的基于哪个您正在接收扫描数据的片段。
到目前为止,我在活动上创建了一个自定义界面并在片段中实现了它。它允许我在视图寻呼机切换页面时调用片段上的方法。基于这些方法,我可以在一个页面上取消初始化事件处理程序并在另一个页面上初始化它。以下是片段活动的示例:
private void ViewPager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e)
{
int position = (int)e.Position;
ICustomFragmentLifecycleForPager fragmentToResume = (ICustomFragmentLifecycleForPager)adapter.InstantiateItem(viewPager, position);
fragmentToResume.onResumePagerFragment(previousActiveFragment);
ICustomFragmentLifecycleForPager fragmentToPause = (ICustomFragmentLifecycleForPager)adapter.InstantiateItem(viewPager, previousActiveFragment);
fragmentToPause.onPausePagerFragment();
previousActiveFragment = position;
}
因此,有了这个,我按需要工作,因为当我在片段上实现接口时,我会在我可以de-init的片段上调用onPausePagerFragment,并且我可以在片段上调用onResumePagerFragment。
所有这一切,我遇到的问题实际上是在第一次启动时。在第一次启动时,我将片段设置为首先显示,当我这样做时,
ViewPager_PageSelected
最初不会调用,因此不会调用我的自定义接口方法来初始化或取消初始化扫描程序。
我尝试过的一件事是在活动的onCreate中放置一个方法调用(也在onStartup和onResume中尝试过),理论上只在应用程序启动时调用一次,然后检查哪个片段是活动的在启动时强制接口方法适当地触发。然而,这感觉很笨,并且不能正常工作。除了不能正常工作之外,我也在片段中获得null异常,当接口方法触发因为我强制它在活动的onCreate中时,片段上的接口onResumePagerFragment调用的方法返回这里的活动为null:
var activity = (Home)Activity;
之前在代码中的其他位置工作并继续工作,所以我怀疑这种情况正在发生,因为在接口调用片段上的方法之前,活动尚未完全启动,并且它尝试获取对活动的引用。再次,我尝试在onResume和onStart上执行此操作,但我仍然得到null。
总而言之,一般来说处理像我这样的场景的最佳方法是什么,我有主要的活动开始,但后来只是一个片段/视图寻呼机容器,我需要有一个实例事件处理程序一次激活片段?我是否应该甚至需要做一个接口或者更确切地说使用静态类?如果我使用静态类,我知道如何在每个类上获取类的实例,但是如何创建事件处理程序并确保在另一个片段抓取实例时也取消注册?
谢谢!
麦克
答案 0 :(得分:1)
我无法向您展示C#代码,但在我的回答下面可以给您一个提示。
https://stackoverflow.com/a/30554102/361100
请注意,Android原生提供EventBus
,我发现的Xamarin是MessageBus component。
其次,您可以设置Service,以便在触发事件时服务充当所有数据通信的委托者。
总之,我们可以认为片段在恢复时不会保证提供相同的片段,尤其是在与ViewPager
一起使用时随时进行垃圾收集。