2013-03-11 13 views
5

Ho un ListView con diverse righe. Ogni riga ha un button.Inizia FragmentTransaction dall'interno di ArrayAdapter

Voglio il pulsante per avviare una FragmentTransaction per sostituire il frammento che la ListView è in

Tuttavia, nel metodo della AdaptergetView(), questa linea non funziona:.

FragmentTransaction t = getContext().getSupportFragmentManager().beginTransaction();

Non gli piace il contesto.

Questo può essere fatto in questo modo o la Transazione deve avvenire altrove?

+0

Quale errore vuoi arrivare, nello specifico? – Tushar

+0

L'errore è: 'Il metodo getSupportFragmentManager non è definito per il tipo Contesto' – KickingLettuce

+0

Hai trovato una risposta adatta, in caso affermativo qual è stata la soluzione? – Lion789

risposta

10

getSupportFragmentManager() è definito solo per la classe FragmentActivity, non per Context. Pertanto, il compilatore non può risolvere la chiamata se si tenta di chiamarlo su un oggetto di tipo Context.

È possibile utilizzare la riflessione per eseguire questa operazione in modo sicuro. Funzionerà sempre finché si passa FragmentActivity come Context. Nota: FragmentActivity è una sottoclasse di Context, quindi è possibile passare FragmentActivity ovunque sia possibile passare Context.

Così utilizzare questo codice invece:

if (getContext() instanceof FragmentActivity) { 
    // We can get the fragment manager 
    FragmentActivity activity = (FragmentActivity(getContext())); 
    FragmentTransaction t = activity.getSupportFragmentManager().beginTransaction(); 
} 
+0

E se non si tratta di un'istanza di fragmentActivity, ed è solo un'attività ... come andare su questo – Lion789

+0

@ Lion789 Bene un'attività non di frammento non avrebbe un FragmentManager, e quindi non 'getSupportFragmentManager' o' getFragmentManager', quindi non puoi usare Fragments con esso. – Tushar

+0

come posso usare 'getSupportFragmentManager() .beginTransaction() .replace (R.id.content_frame, Fragment_home.newInstance(), Fragment_home.TAG) .commit();' in array side adapter.it ottiene errore quando lo uso secondo la tua soluzione – kosala

4

io suggerirei di passare FragmentManager istanza al costruttore di Adapter così:

public class YourAdapter extends... 

    private FragmentManage mFragmentManager;   

    public YourAdapter(FragmentManager fm) { 
     mFragmentManager = fm; 
    } 

e usarlo in modo esplicito:

FragmentTransaction ft = mFragmentManager.beginTransaction(); 

Questo dovrebbe dare possibilita inizializzare Adapter sia con Fragment.getFragmentManager() o FragmentActivity.getSupportFragmentManager() istanza, poiché sono puntati sullo stesso oggetto

+0

Fare 'public YourAdapter (FragmentManager fm) {' causa un errore che dice 'Costruttore implicito Super ArrayAdapter () non è definito. Deve implicitamente invocare un altro costruttore? – KickingLettuce

+0

Quindi, si sta eseguendo l'override di 'ArrayAdapter'? Dovresti chiamare il costruttore 'super()' con i parametri corrispondenti. Se fornisci il codice sorgente del costruttore della tua scheda, posso fornire la riga esatta –

29

prima ottenere il contesto nel costruttore e quindi provare seguente codice,

FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction(); 
+0

Grazie. –

+0

sei il benvenuto :) –

+0

Mi hai salvato la vita, grazie mille;) – hdiz

Problemi correlati