String von einem Fragment zum nächsten senden

  • Antworten:6
Col.Biernot
  • Forum-Beiträge: 30

19.10.2015, 14:52:26 via Website

Hallo,

Ich habe folgendes Problem. ich habe 2 Fragments welche von meiner MainActivity aus gestartet werden. Eins nimmt Daten entgegen und speichert selbige in einem String. Das zweite soll diese Strings entgegennehmen und in ein Arry einpflegen damit dies in einem ListView dargestellt wird.
Ich bin mir nur nicht ganz schlüssig darüber wie Ich den String von Fragment1 zum Fragment2 bekomme. Intents benutzt man doch nur bei der Kommunikation zwischen Activity und Fragment oder?
Da Ich die Strings in der Activity allerdings nicht brauche bin Ich mir nicht sicher wie man das am geschicktesten löst.

Grüße
Col.Biernot

EDIT: gerade hab Ich gelesen dass die Kommunikation NUR über die Activity erfolgen sollte. Nie zwischen 2 Fragments. Was soll man denn jetzt glauben? :D

— geändert am 19.10.2015, 15:17:44

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.10.2015, 12:35:27 via Website

Die eigentlich wichtige Information dahinter ist, dass Du NIE mit einer konkreten Instanz des Zielfragments arbeiten solltest, um Daten zu übergeben. Genauso wie man NIE Daten per Konstruktor an das Fragment übergibt, weil die Instanz des Objekts sich ändern kann.

In deinem Fall würde es bedeuten, dass du NICHT auf eine konkrete Instanz des zweiten Fragments zugreifst, die du z.B. in einer Klassenvariable hältst, weil sich die Instanz ändern kann, sobald das System die Activity neustartet.
Stattdessen gehst Du über den FragmentManager der FragmentActivity, suchst dort das Zielfragment z.B. über seinen "Tag" heraus und bekommt immer die aktuelle Instanz des Fragments zurück.
Dem kannst Du die Daten dann direkt übergeben.

— geändert am 20.10.2015, 12:42:05

Antworten
Col.Biernot
  • Forum-Beiträge: 30

20.10.2015, 12:56:14 via Website

Entschuldige für die dumme Frage. Aber kannst du mir das noch genauer erklären?
Ich darf nie direkt auf ein Fragment zugreifen wenn Ich in einem anderen arbeite. So weit so gut. Immer "zwischenspeichern" in er Activity. Aber wie genau komme Ich an die Daten? Intents sind wohl auch nicht empfehlenswert in dem Fall.
Jetzt versuche Ich mich an einem Interface aber so ganz verstehen tue Ich das nicht :D

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.10.2015, 13:46:39 via Website

Eben NICHT zwischenspeichern in der Activity.
Du holst dir das Fragment JEDES MAL, wenn du mit ihm reden willst, direkt vom FragmentManager.
Zwischenspeichern würde ja eine konkrete Instanz ansprechen.
Da aber beim Neustart der Activity potenziell eine neue Instanz des Fragments erzeugt wird, wäre der Zeiger auf das Fragment, das du vorher zwischengespeichert hattest entweder NULL, oder eine "tote" Instanz.

Hier steht es Schritt für Schritt beschrieben: http://developer.android.com/training/basics/fragments/communicating.html

Antworten
Col.Biernot
  • Forum-Beiträge: 30

20.10.2015, 14:35:31 via Website

Sorry falsch verstanden.

Ich hab mich etwas eingelesen und möchte nun einen String (welcher beim drücken eines Buttons generiert wird) direkt an die MainActivity weitergeben (erster Teil)public class AddDataFragment extends Fragment {

EDIT: Ich habe festgestellt dass Ich meinen Input gar nicht als string gespeichert habe. das habe ich jetzt nachgeholt :

import android.app.Activity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;

public class AddDataFragment extends Fragment {

Button buttonadd;

private EditText inputProduct;
private EditText inputLabel;

private TextView listElement;

private OnFragmentInteractionListener mListener;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentInteractionListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_add_data, container, false);
    inputProduct = (EditText) view.findViewById(R.id.editText_product);
    inputLabel = (EditText) view.findViewById(R.id.editText_label);
    buttonadd = (Button) view.findViewById(R.id.button_add_addData);

    buttonadd.setEnabled(true);

    buttonadd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String dataInput = inputProduct.getText().toString() + inputLabel.getText().toString();

            mListener.sendText(dataInput);
        }

    });

    return view;
}

public interface OnFragmentInteractionListener {
    void sendText(String dataInput);
}

}

Dürfte doch so Korrekt sein oder?

In meiner MainActivity habe Ich das Interface eingebunden.

    @Override
public void sendText(String dataInput) {

}

Jetzt stehe Ich aber auf dem Schlauch. funktioniert das so? Ich kann (warum auch immer) In der MainActivity keine Ausgabe erzeugen.

— geändert am 20.10.2015, 15:25:46

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.10.2015, 15:34:27 via Website

Wenn du die Daten wirklich an die MainActivity übergeben willst, dürfte das so gehen.
Dann solltest Du aber auch beim onDetach den Listener deregistrieren und beim Button-Click auf mListener != null prüfen.

Mir ist aber der Anwendungsfall noch immer nicht ganz klar.

Antworten
Col.Biernot
  • Forum-Beiträge: 30

20.10.2015, 15:38:26 via Website

Vielleicht sollte Ich die Anwendung mal erklären :D

Ich habe eine MainActivity mit navigationDrawer. Dort rufe Ich entweder mein AddDataFragment auf um mehrere Daten einzugeben welche dann zu einem String vereint an mein ListViewFragment weitergereicht werden sollen um Sie dort in einer Liste anzuzeigen.
Mir erschien es am sinnvollsten das in zwei Fragmente zu splitten und die Daten einfach nur hin und her zu schieben.

Antworten