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?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
.
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
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.
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.
J E ,