2015-09-22 79 views
22

在Android中,如果具有應用程序上下文,則可以註冊一個Application.ActivityLifecycleCallbacks實例,每當Activity執行其生命週期回調時就會調用該實例。掛鉤到片段的生命週期中,如Application.ActivityLifecycleCallbacks

我該如何完成相同的碎片?我認爲Fragments沒有這樣的接口,也沒有任何明確的地方我會補充說。

也許定製一個FragmentHostCallback創建一個FragmentController但我怎麼能插入整個應用程序?

用例是一個庫,每次Fragment調用它的生命週期回調時都需要通知,我不想創建一個BaseFragment。我只想從應用程序的onCreate中調用,就是這樣(如果可能的話...)。

編輯:

我創建an issue in Android Open Source Project這個問題。

回答

16

自Android支持庫的版本25.2.0以來,類FragmentManager.FragmentLifecycleCallbacks是靜態的並且可供所有人訪問。

我們現在可以使用該類的一個實例並將其註冊到ActivitysupportFragmentManager中。

public class ExampleActivity extends AppCompatActivity { 

    public void onCreate(Bundle savedInstaceState) { 

      // initialization code 
      getSupportFragmentManager() 
      .registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { 
       @Override 
       public void onFragmentPreAttached(FragmentManager fm, Fragment f, Context context) { 
        super.onFragmentPreAttached(fm, f, context); 
       } 

       @Override 
       public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) { 
        super.onFragmentAttached(fm, f, context); 
       } 

       @Override 
       public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { 
        super.onFragmentCreated(fm, f, savedInstanceState); 
       } 

       @Override 
       public void onFragmentActivityCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { 
        super.onFragmentActivityCreated(fm, f, savedInstanceState); 
       } 

       @Override 
       public void onFragmentViewCreated(FragmentManager fm, Fragment f, View v, Bundle savedInstanceState) { 
        super.onFragmentViewCreated(fm, f, v, savedInstanceState); 
       } 

       @Override 
       public void onFragmentStarted(FragmentManager fm, Fragment f) { 
        super.onFragmentStarted(fm, f); 
       } 

       @Override 
       public void onFragmentResumed(FragmentManager fm, Fragment f) { 
        super.onFragmentResumed(fm, f); 
       } 

       @Override 
       public void onFragmentPaused(FragmentManager fm, Fragment f) { 
        super.onFragmentPaused(fm, f); 
       } 

       @Override 
       public void onFragmentStopped(FragmentManager fm, Fragment f) { 
        super.onFragmentStopped(fm, f); 
       } 

       @Override 
       public void onFragmentSaveInstanceState(FragmentManager fm, Fragment f, Bundle outState) { 
        super.onFragmentSaveInstanceState(fm, f, outState); 
       } 

       @Override 
       public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { 
        super.onFragmentViewDestroyed(fm, f); 
       } 

       @Override 
       public void onFragmentDestroyed(FragmentManager fm, Fragment f) { 
        super.onFragmentDestroyed(fm, f); 
       } 

       @Override 
       public void onFragmentDetached(FragmentManager fm, Fragment f) { 
        super.onFragmentDetached(fm, f); 
       } 
      }, true); 
     } 
} 
+0

25.2.0以前的版本的任何解決方案? –

+0

不是我所知道的。您可以使用「BaseFragment」方法來模擬它,與此相比,它非常有限。我已經看到有更多的「神祕」方式的人喜歡有線程傾聽事件,但沒有測試過,不會推薦它。現在只是更新支持庫的問題 – Olinasc

1

那麼該活動調度其FragmentManager的回調。稍後,片段管理器將調用分派給片段。沒有地方可以在FragmentManager中註冊FragmentLifeCycleCallback。然而,在碎片初始化後的任何時候,你都可以從Fragment中的mState變量中獲得碎片狀態。 你只能跟蹤如下面的代碼片段經理返回堆棧:

 final FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount()); 
     } 
    }); 

希望這將有助於。