13

Sto cercando di chiamare un metodo in un activty da uno schermo Fragment.metodo di chiamata Attività Da All'interno Di Un Frammento

Ho un metodo chiamato myMethod() che è in un'attività chiamata MyActivity; Ho un frammento chiamato Screen1Fragment.

vorrei chiamare MyActivity.myMethod() dall'interno del Screen1Fragment, ma non sono sicuro come fare questo.

In precedenza lo Screen1Fragment era un'attività e quindi estendevo MyActivity in modo che potessi chiamare direttamente myMethod(). Ma ho dovuto modificare l'attività in un frammento per l'utilizzo di schede scorrevoli.

Grazie in anticipo.

+5

'((YourActivityClass) getActivity) .myMethod();' –

+0

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – jpm

+0

Ciao, quando provo questo ottengo un errore che dice non può lanciare da FragmentActivity a MyActivity. MyActivity deve estendere FragmentActivity affinché sia ​​in grado di utilizzare questo codice. –

risposta

30

Uso getActivity() nel frammento.

MyActivity activity = (MyActivity) getActivity(); 
activity.myMethod(); 

se non siete sicuri se il frammento è collegato a MyActivity poi

Activity activity = getActivity(); 
if(activity instanceof MyActivity){ 
     MyActivity myactivity = (MyActivity) activity; 
     myactivity.myMethod(); 
} 
+0

Ciao, il primo modo mi dà un errore che non può trasmettere da FragmentActivity a MyActivity. Il secondo modo non mi dà un errore ma non sta caricando il metodo sul clic del pulsante. Devo solo inserire il codice all'interno del pulsante al clic. –

+1

Quindi è necessario estendere l'attività da FragmentActivity anziché Activity. (la classe pubblica MyActivity estende FragmentActivity {...) – Sipka

+0

Ciao, il primo modo funzionava alla grande, ma per qualche motivo la mia applicazione si arresta in modo anomalo quando provo ad usarlo. –

0

Se il metodo è il metodo statico di MainActivity, qualcosa come:

public static void someMethod(){} 

Poi, è è piuttosto semplice. Basta chiamare

MainActivity.someMethod() 

Tuttavia, credo che quello che si vuole veramente è quello di accedere ad alcune funzioni dalla classe di attività. Quindi è possibile utilizzare il seguente codice nella visualizzazione creater Frammento

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState){ 

     container.getContext().someMethod(); 

    } 
+2

IMO questa è una cattiva pratica. 1. contenitore potrebbe essere null e getContext() restituisce Context, che deve ancora verificare se l'istanza MyActivity. 2.Non si desidera comunicare con Activity tramite metodi statici, poiché non è possibile avere 2 istanze di tale attività. – Sipka

+1

Buon punto. Ma immagino che sia OK in questo caso. Sembra che il proprietario della domanda desideri alcune schede scorrevoli nell'attività. Siamo abbastanza sicuri che l'attività sia lì. Non sto suggerendo comunque di usare un metodo statico. Sto indovinando qual è la vera domanda. –

18

Si dovrebbe rendere il vostro frammento del tutto indipendente l'attività che si sta collegando a. Il punto di Fragments è che puoi riutilizzarli in diversi contesti con diverse attività. Per raggiungere questo obiettivo ed essere ancora in grado di chiamare metodi dalla tua attività, il seguente modello è raccomandato nel official documentation.

Nel frammento:

  • definiscono un'interfaccia pubblica con il metodo

    public interface MyFragmentCallback{ 
        public void theMethod(); 
    } 
    
  • definire un campo e ottenere un riferimento Cast:

    private MyFragmentCallback callback; 
    public void onAttach(Activity activity){ 
        callback = (MyFragmentCallback) activity 
        super.onAttach(activity); 
    } 
    

nella vostra attività

  • attuare MyFragmentCallback nella definizione della classe.
  • implementare theMethod() nella vostra attività (Eclipse vi chiederà di farlo)

Poi, dal frammento, è possibile chiamare callBack.theMethod()

La differenza tra questo e semplicemente chiamando il metodo su getActivity() è che il tuo frammento non è più associato a questa attività specifica. Quindi puoi riutilizzarlo con altre attività, ad esempio una per i telefoni e l'altra per i tablet.

+0

Questo è il modo corretto! Per google docs! – sandalone