FragmentManager de contexto

Creé un nuevo View clase. Dentro de esa clase necesito tener acceso a la FragmentManager, pero no puedo entender cómo.

¿Puedo acceder al FragmentManager de un contexto?

CustomView extends LinearLayout

preguntado el 21 de mayo de 12 a las 18:05

5 Respuestas

Solo si el Contexto dado extiende la Actividad (Post-Honeycomb) o FragmentActivity (pre-honeycomb).

En cuyo caso, tendrías que asegurarte al 100 % de que se trata de una actividad que utiliza la reflexión o la captura de prueba.

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

Pensé que recomendaría refactorizar para que un View en realidad solo está destinado a mostrar cosas y en realidad no debería modificar el estado de su aplicación, pero esa es mi opinión.

Respondido 17 ago 14, 05:08

Un DialogFragment contiene la vista en cuestión. Básicamente, tengo un DialogFragment que se divide en secciones según el botón seleccionado actualmente. Muestro la vista adecuada. Dividí cada sección visualizable en su propia vista. Habría usado un Fragmento, pero no puedo incrustar un fragmento dentro de un fragmento. - Steve

Voy a buscar la vista por id y pasar una referencia a la actividad. - Steve

¿Por qué no simplemente cambiar la vista del controlador DialogFragment? Parece que sería tan complicado como lo que estás tratando de hacer. - DeeV

Eso es lo que está haciendo. DialogFragment está intercambiando las vistas. Sin embargo, tengo las vistas que contienen algo de lógica y posiblemente muestran otros fragmentos de diálogo en respuesta a los eventos de uso, por lo que las vistas necesitan una forma de obtener el administrador de fragmentos. Sé que no se recomienda que las vistas contengan lógica... Simplemente no estoy seguro de cuál es la mejor manera de dividir las secciones. - Steve

@LeiLeyba: los fragmentos tienen métodos "getFragmentManager()" y "getChildFragmentManager()", por lo que no estoy seguro de lo que está preguntando. Sin embargo, esos (probablemente) devolverán un valor nulo si el Fragmento no está adjunto a una Actividad. También puede usar "getActivity().getFragmentManager()" para usar FragmentManager también. - DeeV

si está utilizando fragmentos de soporte, probablemente desee:

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

Respondido 23 Jul 14, 17:07

Esto es lo que funcionó para mí:

Context mContext;
...


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

(Por supuesto, primero debe inicializar mContext)

respondido 26 nov., 15:06

¿Qué es esta lógica de casting, cómo lo hizo posible? BlackHawk

Puede obtener acceso a un FragmentManager (o SupportFragmentManager) en una aplicación, pero como sugieren otras respuestas, solo puede hacerlo a través de una instancia de actividad.

Sin embargo, puede obtener acceso a FragmentManager a través de una actividad sin necesidad de llamar directamente a ninguna actividad mediante la interfaz ActivityLifecycleCallbacks:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {

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

    ...

respondido 28 mar '17, 15:03

Dado que su objeto de contexto no siempre se puede convertir directamente en Actividad, esta es una forma más confiable de hacerlo:

@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 
}

Respondido 21 Feb 18, 10:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.