Wie übergebe ich eine Variable von Aktivität an Fragment und gebe sie zurück?

135

Ich mache gerade eine Android-App und möchte ein Datum zwischen Aktivität und Fragment übergeben. Meine Aktivität hat eine Schaltfläche, die das Fragment öffnet: DatePickerFragment.

In meiner Aktivität zeige ich ein Datum an, das ich mit dem Fragment ändern möchte. Daher möchte ich das Datum an den Datepicker übergeben und an die Aktivität zurücksenden.

Ich habe viele Lösungen ausprobiert, aber keine funktioniert. Der einfache Weg würde ein Argument übergeben, aber dies kann nicht mit Fragmenten durchgeführt werden.

Eugene Primako
quelle
Mein Problem ist genau das gleiche wie deins. Ich frage mich, warum die Beispiele nur die Fragmente selbst als "Benutzer" der Datumsauswahl behandeln, nicht die Aktivität, mit der sie gestartet wurden.
Claudio

Antworten:

213

Um Informationen an ein Fragment zu übergeben , legen Sie beim Erstellen Argumente fest und können dieses Argument später über die Methode onCreate oder onCreateView Ihres Fragments abrufen.

In der newInstance-Funktion Ihres Fragments fügen Sie die Argumente hinzu, die Sie an das Fragment senden möchten:

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

Dann innerhalb des Fragments auf der Methode onCreateoder onCreateViewSie können die Argumente wie folgt abrufen:

Bundle args = getArguments();
int index = args.getInt("index", 0);

Wenn Sie jetzt von Ihrem Fragment aus mit Ihrer Aktivität kommunizieren möchten (Senden oder Nicht-Senden von Daten) , müssen Sie Schnittstellen verwenden. Wie Sie dies tun können, wird im Dokumentations-Tutorial zur Kommunikation zwischen Fragmenten sehr gut erklärt. Da alle Fragmente über die Aktivität miteinander kommunizieren, können Sie in diesem Lernprogramm sehen, wie Sie Daten vom tatsächlichen Fragment an seinen Aktivitätscontainer senden können, um diese Daten für die Aktivität zu verwenden, oder an ein anderes Fragment senden können, das Ihre Aktivität enthält.

Dokumentations-Tutorial:

http://developer.android.com/training/basics/fragments/communicating.html

jpardogo
quelle
10
Ich denke, die Leute stellen diese Frage immer wieder, weil sie in der Dokumentation nicht wirklich gut erklärt ist.
Michael Alan Huff
1
Ich bin immer noch verwirrt darüber, welche Methode die beste ist, Ihre oder die unten stehende, die von @Elenasys
Yoann Hercouet am
Es gibt eine neue Möglichkeit, Daten mithilfe von Architekturkomponenten (E / A '17) zwischen Fragmenten
auszutauschen
Wie wäre es mit den Fragmenten, die im XML-Layout erstellt werden?
Ralphgabb
Ich möchte keine statische Methode mehr verwenden.
Ahamadullah Saikat
89

Senden von Daten von Activityan aFragment

Aktivität:

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

Fragment:

Lesen des Wertes in Fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

Wenn Sie jedoch Werte von Fragment an Activity senden möchten, lesen Sie die Antwort von jpardogo. Sie benötigen Schnittstellen und weitere Informationen: Kommunikation mit anderen Fragmenten

Jorgesys
quelle
2
Wie übergebe ich ein benutzerdefiniertes Objekt? Ich benutzte, Parcelableaber das gab mirclass cast exception
Viper
Diese Lösung funktioniert nicht für mich, kann nicht finden, woher die Transaktion importiert werden soll
thebeancounter
Wenn Sie das Fragment in Ihre Aktivität laden, können Sie Werte über ein in Ihrer Transaktion definiertes Bundle senden. Erklären Sie, was Ihr Szenario ist?
Jorgesys
8

danke an @ ρяσsρєя K und Terry ... es hilft mir sehr und funktioniert perfekt

Aus Aktivität senden Sie Daten mit der Absicht:

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

und in der Fragment onCreateView-Methode:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

Referenz: Senden Sie Daten von der Aktivität an Fragment in Android

mahmoud zaher
quelle
7

Verwenden Sie die Bibliothek EventBus, um ein Ereignis zu übergeben, das Ihre Variable enthalten könnte. Es ist eine gute Lösung, da Ihre Aktivitäten und Fragmente lose miteinander verbunden bleiben

https://github.com/greenrobot/EventBus

SemaphorMetaphor
quelle
4
Ich kann nicht sagen, dass dies keine gute Lösung ist, aber ein Wort der Vorsicht ist vorhanden. Während EventBus enorm einfach zu bedienen ist, liegt hier auch seine Gefahr. Wenn Sie anfangen, zu viele Signale hinzuzufügen, kann die lose gekoppelte Natur es wirklich schwierig machen, zu verfolgen, wer wen anruft und wo verschiedene Ereignisse stattfinden.
Johan Paul
2

Für alle Kotlin-Entwickler da draußen:

Hier ist die von Android Studio vorgeschlagene Lösung zum Senden von Daten an Ihr Fragment (= wenn Sie ein leeres Fragment mit Datei -> Neu -> Fragment -> Fragment (leer) erstellen und "Methoden zur Fragmentfabrik einschließen" aktivieren).

Fügen Sie dies in Ihr Fragment ein:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.applyist ein guter Trick, um Daten festzulegen, wenn ein Objekt erstellt wird oder wie hier angegeben :

Ruft die angegebene Funktion [Block] mit dem thisWert als Empfänger auf und gibt den thisWert zurück.

Dann machen Sie in Ihrer Aktivität oder Ihrem Fragment:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

und lesen Sie die Argumente in Ihrem Fragment wie:

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

Um Daten an Ihre Aktivität zurückzusenden , definieren Sie einfach eine Funktion in Ihrer Aktivität und führen Sie die folgenden Schritte in Ihrem Fragment aus:

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

Genieße die Magie von Kotlin!

Paul Spiesberger
quelle
1

Senden von Daten aus Aktivität in Fragmente, die durch XML verknüpft sind

Wenn Sie in Android Studio ein Fragment mit einer der Vorlagen erstellen, z. B. Datei> Neu> Fragment> Fragment (Liste), wird das Fragment über XML verknüpft. Die newInstance-Methode wird im Fragment erstellt, jedoch nie aufgerufen und kann daher nicht zum Übergeben von Argumenten verwendet werden.

Überschreiben Sie stattdessen in der Aktivität die Methode onAttachFragment

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

Lesen Sie dann die Argumente in der Methode fragment onCreate gemäß den anderen Antworten

Tal
quelle
0

Sie können Ihr Fragment einfach mit einem Bundle instanziieren:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
stef
quelle