来自上下文的FragmentManager

我创建了一个新的 View 类。在那个类中,我需要访问 FragmentManager ,但我无法弄清楚。

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

CustomView extends LinearLayout
32
额外 编辑
意见: 1

5 答案

只有给定的Context扩展了Activity(Post-Honeycomb)或FragmentActivity(pre-honeycomb)。

在这种情况下,你必须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 实际上只是为了显示内容而不应该修改你的应用的状态,但这是我的看法。

48
额外
DialogFragment包含有问题的视图。我基本上有一个DialogFragment,根据当前选中的按钮分为几部分,我将显示相应的视图。我将每个可显示部分分成它自己的视图。我会使用片段,但我不能在片段中嵌入片段。
额外 作者 Steve,
我只是想通过id找到视图,并传入对Activity的引用。
额外 作者 Steve,
这就是它所做的。 DialogFragment正在交换视图。但是,我有包含一些逻辑的视图,并且可能会显示其他对话框片段以响应使用事件,因此视图需要获取片段管理器的方法。我知道不建议让视图包含逻辑..我只是不确定更好的方法来划分部分。
额外 作者 Steve,
为什么不只是让DialogFragment句柄视图交换?看起来它会和你想要做的一样复杂。
额外 作者 DeeV,
@LeiLeyba:片段有一个“getFragmentManager()”和“getChildFragmentManager()”方法,所以我不确定你在问什么。如果片段没有附加到活动,那些将(可能)返回null。您也可以使用“getActivity()。getFragmentManager()”来使用FragmentManager。
额外 作者 DeeV,
“在这种情况下,你必须100%确定这是一个使用反射或试着抓住的活动。”或者只是使用instanceof运算符更好。
额外 作者 Zsolt Safrany,
如果它延伸到片段?
额外 作者 Lei Leyba,

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

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

这对我来说很有用:

Context mContext;
...


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

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

5
额外
铸造的这种逻辑是什么,它是如何成为可能的
额外 作者 blackHawk,

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

但是,您可以通过活动获得的FragmentManager,而不需要直接调用使用ActivityLifecycleCallbacks接口的任何活动:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {

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

    ...
3
额外

由于你的上下文对象不能总是直接转换成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 
}
1
额外