简体   繁体   English

Android ViewPager片段生命周期

[英]Android viewpager fragment lifecyle

I have a Document fragment which is inside viewpager and i use same Document fragment's instance in another part of application. 我在viewpager内部有一个Document fragment ,并且在应用程序的另一部分中使用了相同Document片段的实例。 My problem is that, in fragment i am registering a broadcast receiver, normally i am unregistering it onPause method in fragment. 我的问题是,在片段中我正在注册一个广播接收器,通常我在片段中正在onPause方法上取消它的注册。 But fragments onPause method is not called when i switch another. 但是当我切换另一个时,片段onPause方法不会被调用。 So next fragment of viewpager i use new instance of Document fragment and i am creating new instance of receiver also. 因此, viewpager下一个片段我将使用Document片段的新实例,并且还将创建接收者的新实例。 But onReceive method receiver calls viewpager's document fragment method. 但是onReceive方法的接收者会调用viewpager的文档fragment方法。 So when look at logcat i can see that i can not unregister receiver. 因此,当查看logcat时,我可以看到我无法注销接收器。 How can i unregister receiver, can i get list of registered receviers? 我如何注销接收者,可以获取已注册的接收者列表?

Try to register and unregister Broadcast Receivers in the ViewPager's OnPageChangeListener . 尝试在ViewPager的OnPageChangeListener注册和注销广播接收器。 This listener contains 3 methods namely onPageScrollStateChanged(int state) , onPageScrolled(int position, float positionOffset, int positionOffsetPixels) and onPageSelected(int position) . 该侦听器包含3个方法,分别是onPageScrollStateChanged(int state)onPageScrolled(int position, float positionOffset, int positionOffsetPixels)onPageSelected(int position)

Use onPageScrolledStateChanged() method. 使用onPageScrolledStateChanged()方法。 It uses 3 states for monitoring the Fragments inside the ViewPager. 它使用3种状态来监视ViewPager中的片段。 Use SCROLL_STATE_DRAGGING for unregistering your BroadcastReceiver and SCROLL_STATE_SETTLING for registering your BroadcastReceiver. 使用SCROLL_STATE_DRAGGING取消注册您的BroadcastReceiver,使用SCROLL_STATE_SETTLING注册您的BroadcastReceiver。

也许您可以在片段中使用setUserVisibleHint()方法...或另一个想法,在视图分页器上注册OnPageChangeListener,然后从此侦听器中手动调用方法以注销接收者...

Thank you all for your answers, as you said i implemented OnPageChangeListener and created a logic, it is working fine now. 谢谢大家的回答,正如您所说的,我实现了OnPageChangeListener并创建了一个逻辑,它现在工作正常。 Thank you all again, i am posting the code: 再次谢谢大家,我正在发布代码:

   @Override
   public void onPageSelected(int position) {

       Fragment currentFragment = adapterViewPager.getRegisteredFragment(position);

       if(currentFragment.getClass()==Document.class){
           Log.i (AppConfig.TAG,"Current Fragment is Document");
           Document document = (Document)currentFragment;
           document.registerDownloadService();
       }
       if(lastFragment!=null && lastFragment.getClass()==Document.class){
           Log.i (AppConfig.TAG,"Previous Fragment is Document");
           Document document = (Document)lastFragment;
           document.unregisterDownloadService();
       }
       lastFragment = currentFragment;
   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM