我创建了一个新View
课程。在该课程中,我需要访问FragmentManager
,但我不知道如何。
我可以FragmentManager
从上下文访问吗?
CustomView extends LinearLayout
我创建了一个新View
课程。在该课程中,我需要访问FragmentManager
,但我不知道如何。
我可以FragmentManager
从上下文访问吗?
CustomView extends LinearLayout
仅当给定的 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
实际上只是用于显示内容,实际上不应该修改您的应用程序的状态,但这是我的意见。
如果您正在使用支持片段,您可能实际上想要:
try {
FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
} catch (ClassCastException e) {
Log.e(TAG, "Can't get fragment manager");
}
这对我有用:
Context mContext;
...
//Get FragmentManager
FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager();
(当然你必须首先初始化mContext)
您可以在应用程序中访问 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);
}
...
由于您的上下文对象不能始终直接转换为 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
}