Я создал новый класс 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");
}
Я думал, что рекомендую рефакторинг, так что View
действительно предназначен только для показа вещей и не должен изменять состояние вашего приложения, но это мое мнение.
если вы используете фрагменты поддержки, вам, вероятно, действительно нужно:
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) в приложении - но, как и другие ответы указывают, это можно сделать только через экземпляр активности.
Однако, вы можете получить доступ к FragmentManager через деятельность, без необходимости напрямую позвонить любой деятельности с использованием ActivityLifecycleCallbacks интерфейс:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
activity.getFragmentManager()
if(activity instanceof FragmentActivity) {
((FragmentActivity)activity).getSupportFragmentManager();
}
unregisterActivityLifecycleCallbacks(this);
}
...
Поскольку объект контекста может'т всегда может быть непосредственно преобразован в деятельности, это более надежный способ сделать это:
@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
}