2015-09-22 3 views
22

Androidでは、アプリケーションコンテキストの場合、アクティビティがライフサイクルコールバックのいずれかを実行するたびに呼び出されるApplication.ActivityLifecycleCallbacksインスタンスを登録できます。Application.ActivityLifecycleCallbacksのようなフラグメントのライフサイクルへのフック

どのようにフラグメントに対して同じ処理を行うことができますか?私はFragmentsやそれを追加する明確な場所のためのインターフェイスはないと思う。

おそらくFragmentHostCallbackをカスタマイズしてFragmentControllerを作成することがありますが、アプリケーション全体にどのようにプラグできますか?

このユースケースは、Fragmentがライフサイクルコールバックを呼び出すたびに通知する必要があるライブラリであり、BaseFragmentを作成したくありません。私はアプリケーションのonCreateからのみ呼び出されたい、それはそれです(可能な場合...)。

EDIT:

私はこのことについて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を登録する場所はありません。しかし、フラグメントが初期化された後、いつでも、フラグメント内のmState変数からフラグメント状態を取得できます。 だけ以下のようにフラグメントマネージャでbackstackを追跡することができます。

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

は、これが役立つことを願っています。

関連する問題