如何跨片段跟踪事件处理程序的实例

本文关键字:程序 实例 事件处理 跟踪 何跨 片段 | 更新日期: 2023-09-27 18:06:02

我有一个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;
    }

因此,有了这个,我让它根据需要工作,因为当我在片段上实现接口时,我在片段上调用onPausePagerFragment,我可以去初始化,在片段上调用onResumePagerFragment,我可以初始化。

说了这么多,我遇到的问题实际上是在第一次启动。在第一次启动时,我将片段设置为首先显示当我这样做时,

ViewPager_PageSelected
在初始化时没有调用

,因此没有调用我的自定义接口方法来初始化或反初始化扫描仪。

我已经尝试过的一件事是在活动的onCreate中调用一个方法(也在onStartup和onResume中尝试过),理论上只在应用程序启动时调用一次,然后检查哪个片段在启动时是活动的,并强制接口方法适当地触发。然而,这感觉很笨拙,不能正常工作。除了不能正常工作外,我还在片段中获得空异常,当接口方法因为我强制它在活动的onCreate中触发时,由片段上的接口调用的方法,onResumePagerFragment,在这里为活动返回null:

var activity = (Home)Activity;

这在之前工作过,并继续在代码的其他地方工作,所以我怀疑这是发生的,因为在接口调用片段上的方法之前,活动还没有完全启动,它试图获得对活动的引用。再一次,我试着在onResume和onStart上做这个活动,但我仍然得到一个null。

话虽如此,什么是一般最好的方式来处理像我这样的场景,我有主活动开始,但然后只不过是一个片段/视图页容器,我需要有一个实例的事件处理程序在一个片段上活动的时间?我是否需要做一个接口或者使用一个静态类呢?如果我使用一个静态类,我知道如何获得每个类的实例,但你如何创建事件处理程序,并确保取消注册,以及当另一个片段抓取实例?

谢谢!

迈克

如何跨片段跟踪事件处理程序的实例

我不能给你展示c#代码,但下面我的答案可以给你一个提示。

https://stackoverflow.com/a/30554102/361100

请注意,Android原生提供EventBus和Xamarin我发现是MessageBus组件替代。

其次,你可以让Service在事件被触发时充当所有数据通信的代理。

综上所述,我们可以认为Fragment不能保证在恢复时给出相同的Fragment,特别是当它与ViewPager一起使用时,它会随时被垃圾收集。