362 Stimmen

Daten von einer Aktivität an ein Fragment in Android senden

Ich habe zwei Klassen. Die erste ist Aktivität, die zweite ist ein Fragment, in dem ich einige EditText . In activity habe ich eine Unterklasse mit async-task und in method doInBackground Ich erhalte ein Ergebnis, das ich in einer Variablen speichere. Wie kann ich diese Variable von der Unterklasse "Meine Aktivität" an dieses Fragment senden?

5voto

Wenn ein activity muss eine fragment eine Aktion nach der Initialisierung auszuführen, ist der einfachste Weg, indem man die activity eine Methode auf dem fragment Instanz. In der fragment fügen Sie eine Methode hinzu:

public class DemoFragment extends Fragment {
  public void doSomething(String param) {
      // do something in fragment
  }
}

und dann in der activity erhalten Sie Zugang zum fragment unter Verwendung der fragment Manager und rufen Sie die method :

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DemoFragment fragmentDemo = (DemoFragment) 
            getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
        fragmentDemo.doSomething("some param");
    }
}

und dann die activity kann direkt mit dem fragment durch Aufrufen dieser method .

5voto

sberezin Punkte 3186

Sehr alter Beitrag, trotzdem wage ich es, eine kleine Erklärung hinzuzufügen, die für mich hilfreich gewesen wäre.

Technisch gesehen können Sie Mitglieder jedes Typs in einem Fragment direkt von der Aktivität aus festlegen.
Warum also bündeln?
Der Grund dafür ist ganz einfach: Bundle bietet eine einheitliche Handhabung:
-- Erstellen/Öffnen des Fragments
-- Rekonfiguration (Bildschirmdrehung) - fügen Sie einfach das ursprüngliche/aktualisierte Bundle in onSaveInstanceState() zu outState hinzu
-- Wiederherstellung der Anwendung nach dem Garbage Collecting im Hintergrund (wie bei der Neukonfiguration).

Man kann (wenn man Experimente mag) in einfachen Situationen einen Workaround schaffen, aber der Bundle-Ansatz sieht einfach keinen Unterschied zwischen einem Fragment und tausend auf einem Backstack - er bleibt einfach und unkompliziert.
Deshalb ist die Antwort von @Elenasys ist die eleganteste und universellste Lösung.
Und deshalb ist die Antwort, die von @Martin tiene Fallstricke

4voto

ssi-anik Punkte 2272

Der bessere Ansatz für die Übermittlung von Daten von der Aktivitätsklasse an das Fragment ist die Übergabe über Setter-Methoden. Wie

FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);

und diese Daten einfach aus der Klasse abrufen.

2voto

Qamar Punkte 4483

Verwenden Sie folgende Schnittstelle zur Kommunikation zwischen Aktivität und Fragment

public interface BundleListener {
    void update(Bundle bundle);
    Bundle getBundle();
}

Oder verwenden Sie den folgenden generischen Listener für die bidirektionale Kommunikation über die Schnittstelle

 /**
 * Created by Qamar4P on 10/11/2017.
 */
public interface GenericConnector<T,E> {
    T getData();
    void updateData(E data);
    void connect(GenericConnector<T,E> connector);
}

fragment show methode

public static void show(AppCompatActivity activity) {
        CustomValueDialogFragment dialog = new CustomValueDialogFragment();
        dialog.connector = (GenericConnector) activity;
        dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
    }

können Sie Ihren Kontext auf GenericConnector en onAttach(Context) zu

in Ihrer Tätigkeit

CustomValueDialogFragment.show(this);

in Ihrem Fragment

...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connector.connect(new GenericConnector() {
            @Override
            public Object getData() {
                return null;
            }

            @Override
            public void updateData(Object data) {

            }

            @Override
            public void connect(GenericConnector connector) {

            }
        });
    }
...
    public static void show(AppCompatActivity activity, GenericConnector connector) {
            CustomValueDialogFragment dialog = new CustomValueDialogFragment();
            dialog.connector = connector;
            dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
        }

Hinweis: Verwenden Sie es niemals wie "".toString().toString().toString(); Weise.

2voto

Joshua Majebi Punkte 1090

J E ,

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