49

我创建了一个新View课程。在该课程中,我需要访问FragmentManager,但我不知道如何。

我可以FragmentManager从上下文访问吗?

CustomView extends LinearLayout
4

5 回答 5

61

仅当给定的 Context 扩展了 Activity (Post-Honeycomb) 或 FragmentActivity (pre-honeycomb) 时。

在这种情况下,您必须 100% 确保它是使用反射或 try-catch 的活动。

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");
}

我认为我建议重构,所以 aView实际上只是用于显示内容,实际上不应该修改您的应用程序的状态,但这是我的意见。

于 2012-05-21T18:14:31.937 回答
48

如果您正在使用支持片段,您可能实际上想要:

try {
  FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
} catch (ClassCastException e) {
  Log.e(TAG, "Can't get fragment manager");
}
于 2014-07-23T16:19:07.173 回答
7

这对我有用:

Context mContext;
...


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

(当然你必须首先初始化mContext)

于 2015-08-25T20:37:19.320 回答
3

您可以在应用程序中访问 FragmentManager(或 SupportFragmentManager) - 但正如其他答案所暗示的那样,您只能通过 Activity 实例来执行此操作。

但是,您可以通过 Activity 访问 FragmentManager,而无需使用 ActivityLifecycleCallbacks 接口直接调用任何 Activity:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {

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

    ...
于 2017-03-28T14:03:02.560 回答
2

由于您的上下文对象不能始终直接转换为 Activity,因此这是一种更可靠的方法:

@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 
}
于 2018-02-21T10:17:48.357 回答