2012-03-22 11 views
23

Voglio avviare un nuovo frammento per visualizzare alcuni dati. Al momento, ho un'attività principale che ha una serie di schede della barra delle azioni, ognuna delle quali è un frammento. Quindi, all'interno di un frammento di tabulazione, ho un pulsante, chartsButton. Ho il mio onclicklistener tutto pronto per esso, ed ecco il metodo onClick:Avviare un frammento tramite Intent all'interno di un frammento

public OnClickListener chartsListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     Intent chartFragment = new Intent(); 
     startActivity(chartFragment); 
    } 
}; 

Ora, come ho detto, questo è ascoltatore all'interno di una classe che estende Fragment. Quindi, voglio lanciare un nuovo frammento (chartsFragment) tramite l'intento di sostituire l'intero schermo. Quando l'utente fa clic, li riporta alle schede e all'attività principale. Ecco il mio frammento grafico:

public class chartsFragment extends Fragment { 

    public View onCreateView() { 
     //LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState 
     LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     return (inflater.inflate(R.layout.chartfragment, null)); 
    } 
} 

L'errore corrente ho a che fare con: "android.content.ActivityNotFoundException: trovate attività per gestire Intent {}". Va bene, ho capito che potrei usare getActivity(). StartActivity (chartsFragment), ma che ha lo stesso errore. Suppongo che cosa sto cercando qui, è come faccio a lanciare un intento all'interno di un frammento che si traduce nell'apertura di un nuovo frammento?

risposta

16

Non è possibile aprire nuovi frammenti. I frammenti devono essere sempre ospitati da un'attività. Se il frammento si trova nella stessa attività (ad es. Tabulazioni), la navigazione del tasto Indietro sarà complicata. Suppongo che tu voglia aprire una nuova schermata con quel frammento.

Così si crea semplicemente una nuova attività e si inserisce il nuovo frammento. Tale attività reagirebbe quindi all'intento o esplicitamente tramite la classe di attività o implicitamente tramite intent filter s.

+0

Questo ha funzionato perfettamente. Ho appena creato una nuova classe chiamata Chart, se ha esteso Activity, l'ha inserita nel Manifest e ha caricato il layout xml che avevo inteso per un frammento. La funzionalità posteriore funziona come volevo anch'io. Grazie mille! – Davek804

+0

@ Davek804 puoi aggiornare il codice con la soluzione per favore –

+0

@ Davek804 Puoi spiegarlo con schema o codice ?? – DroidLearner

49

La risposta al tuo problema è semplice: sostituire l'attuale Fragment con il nuovo Fragment e trasferire la transazione sul backstack. Ciò preserva il comportamento del pulsante Indietro ...

La creazione di un nuovo Activity davvero sconfigge l'intero scopo di utilizzare i frammenti comunque ... molto controproducente.

@Override 
public void onClick(View v) { 
    // Create new fragment and transaction 
    Fragment newFragment = new chartsFragment(); 
    // consider using Java coding conventions (upper first char class names!!!) 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    transaction.replace(R.id.fragment_container, newFragment); 
    transaction.addToBackStack(null); 

    // Commit the transaction 
    transaction.commit(); 
} 

http://developer.android.com/guide/components/fragments.html#Transactions

+2

Funziona solo quando entrambi i frammenti sono ospitati dalla stessa attività – androidXP

+0

Forse, ma perché è degno di nota? Ho una sola attività in tutte le mie applicazioni. Questo è un po 'il punto intero, non è vero? limitando il numero di attività? – slinden77

5

Prova questo può aiutare a:

public void ButtonClick(View view) { 
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit(); 
} 
0

Prova questo può aiutare a:

private void changeFragment(Fragment targetFragment){ 

    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main_fragment, targetFragment, "fragment") 
     .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
     .commit(); 

} 
Problemi correlati