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?
Antworten
Zu viele Anzeigen?Sie können öffentliche statische Methode im Fragment erstellen, wo Sie statische Referenz dieses Fragments erhalten und dann Daten an diese Funktion übergeben und diese Daten als Argument in derselben Methode festlegen und Daten über getArgument auf oncreate-Methode des Fragments erhalten und diese Daten auf lokale Variablen festlegen.
Die klügste und bewährteste Art, Daten zwischen Fragmenten und Aktivitäten zu übermitteln, ist die Erstellung von Variablen, Beispiel:
class StorageUtil {
public static ArrayList<Employee> employees;
}
Die Datenübergabe vom Fragment zur Aktivität erfolgt dann in der Methode onActivityCreated:
//a field created in the sending fragment
ArrayList<Employee> employees;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
employees=new ArrayList();
//java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below
//Adding first employee
Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
employees.add(employee);
//Adding second employee
Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
employees.add(employee);
StorageUtil.employees=employees;
}
Jetzt können Sie den Wert von StorageUtil.employees von überall her bekommen. Viel Glück!
Meine Lösung besteht darin, eine statische Methode innerhalb des Fragments zu schreiben:
public TheFragment setData(TheData data) {
TheFragment tf = new TheFragment();
tf.data = data;
return tf;
}
Auf diese Weise kann ich sicher sein, dass sich alle benötigten Daten im Fragment befinden, bevor ein anderer möglicher Vorgang damit arbeiten muss. Außerdem sieht es meiner Meinung nach sauberer aus.
Ich habe 3 Tage lang gekämpft und keine der Lösungen hat funktioniert. Hier ist die letzte, die funktioniert hat.
Schritt 1- Erstellen Sie eine ViewModel-Klasse für die gemeinsame Nutzung von Daten zwischen der Aktivität und dem Fragment.
public class MyViewModel extends ViewModel {
private MutableLiveData<String> myData = new MutableLiveData<>();
public void setData(String data) {
myData.setValue(data);
}
public LiveData<String> getData() {
return myData;
}
}
Schritt 2- Erstellen Sie in der Aktivität eine Instanz des ViewModel und setzen Sie die Daten mit der Methode setData().
MyViewModel myViewModel = new
ViewModelProvider(this).get(MyViewModel.class);
myViewModel.setData("Hello from Activity!");
Schritt 3 - Holen Sie sich im Fragment eine Instanz des ViewModel und beobachten Sie die Daten mit der Methode getData().
MyViewModel myViewModel = new
ViewModelProvider(requireActivity()).get(MyViewModel.class);
myViewModel.getData().observe(getViewLifecycleOwner(), new
Observer<String>() {
@Override
public void onChanged(@Nullable String data) {
// update UI with the new data
}
});
Mit diesen Schritten wird das Fragment in der Lage sein, die von der Aktivität im ViewModel eingestellten Daten zu empfangen und zu aktualisieren. Beachten Sie, dass das ViewModel auf die Activity skaliert ist, sodass es auch dann bestehen bleibt, wenn das Fragment bei Konfigurationsänderungen zerstört und neu erstellt wird.