2012-05-21 2 views
31

新しいViewクラスを作成しました。そのクラス内ではFragmentManagerにアクセスする必要がありますが、どのように把握できません。FragmentManager from Context

文脈からFragmentManagerにアクセスできますか?

CustomView extends LinearLayout 

答えて

47

与えられたContextがActivity(Post-Honeycomb)またはFragmentActivity(Pre-honeycomb)を拡張する場合のみ。

この場合、リフレクションまたはtry-catchを使用していることを100%確かめる必要があります。

try{ 
    final Activity activity = (Activity) context; 

    // Return the fragment manager 
    return activity.getFragmentManager(); 

    // If using the Support lib. 
    // return activity.getSupportFragmentManager(); 

} catch (ClassCastException e) { 
    Log.d(TAG, "Can't get the fragment manager with this"); 
} 

思想私はそうViewは本当にただのものを示すためのものであり、実際のアプリの状態を変更する、それが私の意見だべきではありませんリファクタリングをお勧めします。

+0

DialogFragmentには問題のビューが含まれています。私は基本的に、現在選択されているボタンに基づいてセクションに分割されたDialogFragmentを持っており、適切なビューを表示します。私は各表示可能なセクションをそれ自身のビューに分割しました。私はフラグメントを使用していましたが、フラグメント内にフラグメントを埋め込むことはできません。 – Steve

+0

私はIDでビューを見つけ、アクティビティへの参照を渡します。 – Steve

+0

DialogFragmentがビューのスワップを処理するだけではないのはなぜですか?それはあなたがやろうとしているものと同じように複雑に思えるようです。 – DeeV

29

あなたがサポートフラグメントを使用している場合、あなたはおそらく、実際にしたい:

try { 
    FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); 
} catch (ClassCastException e) { 
    Log.e(TAG, "Can't get fragment manager"); 
} 
4

は、これが私の仕事です:

Context mContext; 
... 


//Get FragmentManager 
FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager(); 

を(もちろん、あなたが最初にすべてのmContextを初期化する必要が)

+0

どのようにこのキャスティングのロジックは、可能になりました – blackHawk

3

アプリケーション内のFragmentManager(またはSupportFragmentManager)にアクセスできますが、他の回答から分かるように、これはアクティビティインスタンスを介してのみ行うことができます。

しかし、あなたが直接ActivityLifecycleCallbacksインターフェイスを使用して、任意の活動を呼び出すために必要とせずに活動を経てFragmentManagerへのアクセスを得ることができます、

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks { 

    @Override 
    public void onActivityCreated(Activity activity, Bundle bundle) { 
     activity.getFragmentManager() 
     if(activity instanceof FragmentActivity) { 
      ((FragmentActivity)activity).getSupportFragmentManager(); 
     } 
     unregisterActivityLifecycleCallbacks(this); 
    } 

    ... 
0

あなたのコンテキストオブジェクトは、常に直接活動にキャストすることはできませんので、これを

@Nullable 
public static Activity getActivityFromContext(@NonNull Context context){ 
    while (context instanceof ContextWrapper) { 
     if (context instanceof Activity) return (Activity) context; 
     context = ((ContextWrapper)context).getBaseContext(); 
    } 
    return null; //we failed miserably 
}