387 Stimmen

Aufruf einer Aktivitätsmethode aus einem Fragment

Ich versuche, eine Methode in meiner Aktivität von einem Fragment aus aufzurufen. Ich möchte, dass das Fragment der Methode Daten gibt und die Daten erhält, wenn die Methode zurückkehrt. Ich möchte erreichen, ähnlich wie auf eine statische Methode aufrufen, aber ohne die Verwendung von statischen, weil es Probleme in der Aktivität erstellen.

Ich bin neu bei Fragmenten und brauche eine einfache und pädagogische Erklärung!

Danke!

945voto

Richard Punkte 13999

Vom Fragment zur Aktivität:

((YourActivityClassName)getActivity()).yourPublicMethod();

Von der Aktivität zum Fragment:

FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

Wenn Sie ein Fragment über Code hinzugefügt und ein tag Zeichenfolge, als Sie Ihr Fragment hinzugefügt haben, verwenden Sie findFragmentByTag stattdessen:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

234voto

Marco RS Punkte 7914

Sie sollten wahrscheinlich versuchen, das Fragment von der Aktivität zu entkoppeln, falls Sie es an anderer Stelle verwenden wollen. Sie können dies tun, indem Sie eine Schnittstelle erstellen, die Ihre Aktivität implementiert.

Sie würden also eine Schnittstelle wie die folgende definieren:

Nehmen wir an, Sie möchten der Aktivität einen String geben und sie soll einen Integer zurückgeben:

public interface MyStringListener{
    public Integer computeSomething(String myString);
}

Dies kann im Fragment oder in einer separaten Datei definiert werden.

Dann müsste Ihre Aktivität die Schnittstelle implementieren.

public class MyActivity extends FragmentActivity implements MyStringListener{

  @Override
  public Integer computeSomething(String myString){
   /** Do something with the string and return your Integer instead of 0 **/ 
   return 0;
  }

}

Dann würden Sie in Ihrem Fragment eine MyStringListener-Variable haben und Sie würden den Listener in der Fragment onAttach(Activity activity)-Methode festlegen.

public class MyFragment {

        private MyStringListener listener;

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                listener = (MyStringListener) context;
            } catch (ClassCastException castException) {
                /** The activity does not implement the listener. */
            }
        }

    }

edit(17.12.2015): onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended

Die erste Antwort funktioniert auf jeden Fall, aber sie verbindet Ihr aktuelles Fragment mit der Host-Aktivität. Es ist eine gute Praxis, das Fragment von der Host-Aktivität zu entkoppeln, falls Sie es in einer anderen Aktivität verwenden möchten.

101voto

Wasim K. Memon Punkte 5861

Para Kotlin Entwickler

(activity as YourActivityClassName).methodName()

Para Java Entwickler

((YourActivityClassName) getActivity()).methodName();

17voto

sivi Punkte 9816

Aktualisieren, nachdem ich besser verstanden habe, wie Fragmente funktionieren. Jedes Fragment gehört zu einer übergeordneten Aktivität. Also einfach verwenden:

getActivity().whatever

Aus dem Inneren des Fragments. Das ist die bessere Lösung, weil Sie so überflüssige Würfe vermeiden. Wenn Sie die Abdrücke mit dieser Lösung nicht vermeiden können, verwenden Sie die folgende Lösung.

\============

Sie müssen sich auf die äußere Aktivität konzentrieren.

((MainActivity) getActivity()).Method();

Die Erstellung einer neuen Instanz verwirrt den Android-Frame und er kann sie nicht erkennen. siehe auch :

https://stackoverflow.com/a/12014834/1984636

https://stackoverflow.com/a/2042829/1984636

10voto

A.Alqadomi Punkte 1479

Obwohl ich Marco's Antwort absolut mag, denke ich, dass es fair ist, darauf hinzuweisen, dass man auch ein auf Publish/Subscribe basierendes Framework verwenden kann, um das gleiche Ergebnis zu erzielen, wenn man z.B. mit dem Event Bus arbeitet, kann man folgendes tun

Fragment :

EventBus.getDefault().post(new DoSomeActionEvent()); 

Tätigkeit:

 @Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X