13

Ich versuche, eine Methode in einer Aktivitätsdatei von einem Fragmentbildschirm aus aufzurufen.Aufruf der Aktivitätsmethode aus einem Fragment heraus

Ich habe eine Methode namens myMethod(), die in einer Aktivität namens MyActivity ist; Ich habe ein Fragment namens Screen1Fragment.

Ich möchte MyActivity.myMethod() aus dem Screen1Fragment aufrufen, aber ich bin mir nicht sicher, wie dies zu tun ist.

Früher war das Screen1Fragment eine Aktivität und daher erweiterte ich MyActivity so, dass ich direkt myMethod() aufrufen konnte. Aber ich musste die Aktivität in ein Fragment für Schieberegister Verwendung ändern.

Vielen Dank im Voraus.

+5

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

+0

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

+0

Hallo, wenn ich dies versuchen, erhalte ich eine Fehlermeldung, kann nicht werfen von FragmentActivity zu MyActivity. Muss MyActivity FragmentActivity erweitern, damit ich diesen Code verwenden kann? –

Antwort

30

Verwenden Sie getActivity() in Ihrem Fragment.

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

wenn Sie nicht sicher sind, ob Ihr Fragment dann MyActivity angebracht ist

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

Hallo, der erste Weg gibt mir einen Fehler, der nicht von FragmentActivity auf MyActivity wirken kann. Der zweite Weg gibt mir keinen Fehler, aber es lädt nicht die Methode auf Knopfdruck. Platziere ich den Code einfach in die Schaltfläche beim Klicken. –

+1

Dann sollten Sie Ihre Aktivität von FragmentActivity anstatt von Activity erweitern. (öffentliche Klasse MyActivity erweitert FragmentActivity {...) – Sipka

+0

Hallo, der erste Weg funktionierte großartig, aber aus irgendeinem Grund stürzt meine Anwendung jetzt ab, wenn ich versuche, sie zu benutzen. –

0

Wenn die Methode die statische Methode MainActivity ist, so etwas wie:

public static void someMethod(){} 

Dann wird ist ziemlich einfach. Rufen Sie einfach an

Aber ich denke, was Sie wirklich wollen, ist der Zugriff auf eine Funktion aus der Activity-Klasse. Dann können Sie den folgenden Code in das Fragment Ansicht creater verwenden

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

     container.getContext().someMethod(); 

    } 
+2

IMO das ist schlechte Praxis. 1. container ist möglicherweise null, und getContext() gibt Context zurück, das Sie noch überprüfen müssen, ob MyActivity-Instanz. 2.Sie möchten nicht über statische Methoden mit Activity kommunizieren, da dann 2 Instanzen dieser Aktivität nicht möglich sind. – Sipka

+1

Guter Punkt. Aber ich denke, es ist in diesem Fall in Ordnung. Es scheint, dass der Eigentümer der Frage einige Schieberegler in der Aktivität möchte. Wir sind ziemlich sicher, dass die Aktivität da ist. Ich schlage nicht vor, eine statische Methode zu verwenden. Ich vermute, was ist die wahre Frage. –

18

Sie sollten Ihre Fragment völlig unabhängig von der Aktivität machen Sie es sich zu befestigen. Der Sinn von Fragments besteht darin, dass Sie diese in verschiedenen Kontexten mit unterschiedlichen Aktivitäten wiederverwenden können. Um dies zu erreichen und weiterhin Methoden aus Ihrer Aktivität aufrufen zu können, wird das folgende Muster in der official documentation empfohlen.

In Ihrem Fragment:

  • eine öffentliche Schnittstelle mit der Methode definieren

    public interface MyFragmentCallback{ 
        public void theMethod(); 
    } 
    
  • ein Feld definieren und eine gegossene Referenz erhalten:

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

in Ihrer Tätigkeit

  • MyFragmentCallback in der Klassendefinition implementieren.
  • implementieren theMethod() in Ihrer Tätigkeit (Eclipse Sie bitten, dies zu tun)

Dann aus dem Fragment, können Sie callBack.theMethod()

Der Unterschied zwischen diesem Aufruf und einfach Ihre Methode auf getActivity() aufrufen ist, dass Ihr Fragment nicht mehr mit dieser spezifischen Aktivität gekoppelt ist. So können Sie es mit anderen Aktivitäten wiederverwenden, zum Beispiel eins für Telefone und das andere für Tablets.

+0

Das ist der richtige Weg! Pro Google Docs! – sandalone