2015-07-15 16 views
5

Utilizzo Android Studio che implementa tutte le funzioni di una classe di frammenti. Sto ottenendo seguente eccezione di runtime:Come aggiungere un frammento nella mia attività in modo dinamico?

must implement OnFragmentInteractionListener 

Ecco il mio codice e ho implementato il OnFragmentInteractionListener nella mia attività principale.

PRINCIPALI:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (findViewById(R.id.fragment_container) != null) { 
      BlankFragment fragment = new BlankFragment(); 
      android.support.v4.app.FragmentManager manager = getSupportFragmentManager(); 
      android.support.v4.app.FragmentTransaction ft = manager.beginTransaction(); 
      ft.add(R.id.fragment_container, fragment).commit(); 
     } 
    @Override    
    public void onFragmentInteraction(Uri uri) {} 

} 

VUOTO FRAMMENTO:

public class BlankFragment extends android.support.v4.app.Fragment { 
    private OnFragmentInteractionListener mListener; 
    public interface OnFragmentInteractionListener { 
     public void onFragmentInteraction(Uri uri); 
    } 

    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 
} 

I restanti metodi della classe frammento e principali sono implementati anche per default. Ho anche modificato LinearLayout con FrameLayout nel file main_activity.xml file and also assigned android: id` a cui viene fatto riferimento. cosa c'è che non va nel mio codice?

+0

Avete inizializzato 'mListener' l'oggetto dell'interfaccia con l'attività ?? – user007

+0

Stai usando android.support.v4.app.Fragment come classe base in BlankFragment o android.app.Fragment? – lal

+0

Il tuo codice non è chiaro. Rifiuta le due classi (attività e frammento) – GVillani82

risposta

1

Per interagire con il BlankFragment oggetto, vorrei utilizzare il seguente metodo raccomandato nel Android Support Docs - Credo che questo sia ciò che si sta cercando di ottenere, e sarà adatto come l'oggetto BlankFragment è ospitato da MainActivity:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener { 

private BlankFragment fragment = null; 
private android.support.v4.app.FragmentManager manager = null; 
private android.support.v4.app.FragmentTransaction ft; 

public void onFragmentInteraction(Uri uri){ 
     Log.i("Tag", "onFragmentInteraction called"); 
    } 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (manager == null) manager = getSupportFragmentManager();    

    if(manager.findFragmentById(R.id.fragment_container) == null) { 

     //If a fragment is not already loaded into your container, then add one... 

     fragment = new BlankFragment(); 
     ft= manager.beginTransaction(); 
     ft.add(R.id.fragment_container,fragment).commit(); 
    } 
} 

al fine di comunicare con il frammento, si dovrebbe effettuare le seguenti operazioni:

if(fragment == null) { 
    fragment = (BlankFragment) manager.findFragmentById(R.id.fragment_container); 
} 

È quindi possibile chiamare qualsiasi metodo associati fragment

Se è il contrario (comunicazione frammento attività), allora si avrebbe bisogno di fare quanto segue in BlankFragment per formare un legame con il genitore Activity:

//Class variable... 
OnFragmentInteractionListener mCallback; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mCallback = (OnFragmentInteractionListener) activity; 
      } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
     } 
    } 

Potreste aver dimenticato questo ultimo passaggio, che potrebbe spiegare il tuo errore. Si potrebbe quindi utilizzare:

mCallback.onFragmentInteraction(uri); 

Per comunicare con MainActivity

+0

ho appena avviato java una settimana fa. e certamente non capisco molto codice nell'attività vuota. Voglio solo mostrare una casella di testo che si trova nel layout del frammento. questo codice è implementato di default da Android Studio. public void onButtonPressed (Uri uri) { if (mListener! = Null) { mListener.onFragmentInteraction (uri); } } non c'è un pulsante collegato al framment.xml non capisco questo pezzo generato automaticamente. – user3859323

+0

@ user3859323 Era un progetto di esempio creato da Android Studio? Se sì, come l'hai creato? Duplicherò la mia fine e dare un'occhiata. – PPartisan

+0

No, non è un progetto di esempio. quando clicco sulla mia app e aggiungo un frammento ho selezionato blankFragment e generato il suo java e xml. Crea un progetto e aggiungi un frammento vuoto alla tua attività che è tutto ciò che ho tentato di fare. – user3859323

0

Questo ha funzionato per me, ho appena condiviso qui non si sa mai che vi aiuterà fuori qualcun altro.

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit(); 

Solo una riga di codice.

Problemi correlati