2012-05-21 16 views
31

Ho creato una nuova classe View. All'interno di quella classe ho bisogno di accedere allo FragmentManager, ma non riesco a capire come.FragmentManager dal contesto

Posso accedere a FragmentManager da un contesto?

CustomView extends LinearLayout 

risposta

47

Solo se il dato contesto si estende Activity (Post-Honeycomb) o FragmentActivity (pre-nido d'ape).

In tal caso, devi assicurarti al 100% che si tratti di un'attività che utilizza il riflesso o il 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"); 
} 

pensiero vi consiglio refactoring così un View è in realtà solo significato per mostrare cose e non dovrebbe in realtà modificare lo stato della vostra applicazione, ma questo è il mio parere.

+0

Un oggetto di dialogo contiene la vista in questione. Fondamentalmente ho un DialogFragment che è diviso in sezioni basate sul pulsante attualmente selezionato. Io mostro la vista appropriata. Ho diviso ciascuna sezione visualizzabile nella sua vista personale. Avrei usato un frammento, ma non posso incorporare un frammento all'interno di un frammento. – Steve

+0

Sto solo andando a trovare la vista per id, e passare un riferimento per l'attività. – Steve

+0

Perché non basta che lo scambio di visualizzazione gestisca DialogFragment? Sembra che sarebbe complicato come quello che stai cercando di fare. – DeeV

29

se si utilizza frammenti di supporto, probabilmente si vuole realmente:

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

Questo è ciò che ha funzionato per me:

Context mContext; 
... 


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

(Naturalmente si deve prima di tutto inizializzare mContext)

+0

qual è questa logica del casting, come ha reso possibile – blackHawk

3

È possibile accedere a FragmentManager (o SupportFragmentManager) in un'applicazione, ma come suggerito da altre risposte, è possibile farlo solo tramite un'istanza di attività.

Tuttavia, è possibile accedere ad un FragmentManager tramite un'attività senza la necessità di chiamare direttamente ogni attività utilizzando l'interfaccia di ActivityLifecycleCallbacks:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks { 

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

    ... 
0

Dal momento che l'oggetto contesto può non sempre essere direttamente colato a Attività, questa è un modo più affidabile per eseguire questa operazione:

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