2012-05-21 12 views
31

Creé una nueva clase View. Dentro de esa clase necesito tener acceso al FragmentManager, pero no puedo entender cómo.FragmentManager del contexto

¿Puedo acceder al FragmentManager desde un contexto?

CustomView extends LinearLayout 

Respuesta

47

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

En ese caso, debe asegurarse al 100% de que se trata de una actividad que utiliza la reflexión o la prueba de captura.

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

pensamiento me recomiendan por lo que una refactorización View es en realidad significaba para mostrar cosas y no debe realmente modificar el estado de su aplicación, pero esa es mi opinión.

+0

Un DialogFragment contiene la vista en cuestión. Básicamente tengo un DialogFragment que está dividido en secciones basadas en el botón actualmente seleccionado. Muestro la vista apropiada. Dividí cada sección visualizable en su propia vista. Hubiera usado un Fragmento, pero no puedo insertar un fragmento dentro de un fragmento. – Steve

+0

Voy a encontrar la vista por ID y paso una referencia a la Actividad. – Steve

+0

¿Por qué no hacer que el DialogFragment controle el intercambio de vistas? Parece que sería tan complicado como lo que estás tratando de hacer. – DeeV

29

si está utilizando fragmentos de apoyo, es probable que realmente quiere:

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

Esto es lo que funcionó para mí:

Context mContext; 
... 


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

(Por supuesto, usted tiene que en primer lugar inicializar mContext)

+0

¿cuál es esta lógica de fundición, cómo hizo posible – blackHawk

3

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

Sin embargo, puede tener acceso a una FragmentManager a través de una actividad sin necesidad de llamar directamente a cualquier Actividades utilizando 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); 
    } 

    ... 
0

Debido a que su objeto de contexto no siempre se puede lanzar directamente a la actividad, este es una forma más confiable de hacer esto:

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