Ich möchte für Anfänger hinzufügen, dass der Unterschied zwischen den beiden am besten bewerteten Antworten hier durch die unterschiedliche Verwendung eines Fragments gegeben ist.
Wenn Sie das Fragment in der Java-Klasse verwenden, in der Sie die Daten haben, die Sie übergeben möchten, können Sie die erste Antwort anwenden, um Daten zu übergeben:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Wenn Sie jedoch beispielsweise den von Android Studio angegebenen Standardcode für Fragmente mit Registerkarten verwenden, funktioniert dieser Code nicht.
Dies funktioniert auch dann nicht, wenn Sie das Standard-PlaceholderFragment durch Ihre FragmentClasses ersetzen und den FragmentPagerAdapter an die neue Situation anpassen, indem Sie einen Schalter für getItem () und einen weiteren Schalter für getPageTitle () hinzufügen (wie hier gezeigt ).
Warnung: Der oben erwähnte Clip enthält Codefehler, die ich später hier erläutere. Sie ist jedoch hilfreich, um zu sehen, wie Sie vom Standardcode zum bearbeitbaren Code für Fragmente mit Registerkarten wechseln. Der Rest meiner Antwort ist viel sinnvoller, wenn Sie die Java-Klassen und XML-Dateien aus diesem Clip betrachten (repräsentativ für die erste Verwendung von Fragmenten mit Registerkarten durch ein Anfängerszenario).
Der Hauptgrund, warum die am besten bewertete Antwort auf dieser Seite nicht funktioniert, ist, dass in diesem Standardcode für Fragmente mit Registerkarten die Fragmente in einer anderen Java-Klasse verwendet werden: FragmentPagerAdapter!
Um die Daten zu senden, sind Sie versucht, ein Bundle in der MotherActivity zu erstellen und es im FragmentPagerAdapter mit der Antwort Nr. 2 zu übergeben.
Nur das ist wieder falsch. ( Wahrscheinlich könnten Sie es so machen, aber es ist nur eine Komplikation, die nicht wirklich benötigt wird ).
Ich denke, der richtige / einfachere Weg besteht darin, die Daten mit der Antwort Nr. 2 direkt an das betreffende Fragment zu übergeben. Ja, es wird eine enge Kopplung zwischen der Aktivität und dem Fragment geben, ABER für Fragmente mit Registerkarten, was irgendwie erwartet wird. Ich würde Ihnen sogar raten, die Fragmente mit Registerkarten in der Java-Klasse MotherActivity zu erstellen (als Unterklassen, da sie niemals außerhalb der MotherActivity-Klasse verwendet werden). Es ist ganz einfach, in der Java-Klasse MotherActivity so viele Fragmente hinzuzufügen, wie Sie benötigen:
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
Um Daten aus der MotherActivity an ein solches Fragment zu übergeben, müssen Sie private Strings / Bundles über der Aktivität onCreate Ihrer Mutter erstellen. Diese können Sie mit den Daten füllen, die Sie an die Fragmente übergeben möchten, und diese über a weitergeben Methode, die nach dem onCreate erstellt wurde (hier getMyData () genannt).
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
Und dann verwenden Sie in der Fragmentklasse getMyData:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
Wenn Sie Datenbankabfragen haben, empfehle ich Ihnen, diese in MotherActivity auszuführen (und ihre Ergebnisse als Strings / Integers zu übergeben, die wie oben gezeigt an Schlüssel in einem Bundle angehängt sind), da Ihre Syntax innerhalb der Fragmente mit Registerkarten komplexer wird (dies wird zu getActivity) () zum Beispiel, und getIntent wird zu getActivity (). getIntent), aber Sie haben auch die Möglichkeit, zu tun, was Sie möchten.
Mein Rat für Anfänger ist, sich auf kleine Schritte zu konzentrieren. Holen Sie sich zunächst die Absicht, eine sehr einfache Aktivität mit Registerkarten zu öffnen, ohne Daten zu übergeben. Funktioniert es? Öffnet es die erwarteten Registerkarten? Wenn nicht, warum?
Beginnen Sie damit, und wenden Sie Lösungen wie die in diesem Clip vorgestellten an, um festzustellen , was fehlt. Für diesen bestimmten Clip wird die Datei mainactivity.xml nie angezeigt. Das wird Sie sicherlich verwirren. Wenn Sie jedoch darauf achten, werden Sie feststellen, dass beispielsweise der Kontext (tools: context) in den XML-Fragmentdateien falsch ist. Jedes Fragment-XML muss auf die richtige Fragmentklasse (oder Unterklasse mit dem Trennzeichen $) verweisen.
Sie werden auch sehen, dass Sie in der Java-Klasse der Hauptaktivität tabLayout.setupWithViewPager (mViewPager) hinzufügen müssen - direkt nach der Zeile TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); Ohne diese Zeile ist Ihre Ansicht nicht mit den XML-Dateien der Fragmente verknüpft, sondern zeigt NUR die XML-Datei der Hauptaktivität an.
Zusätzlich zu der Zeile in der Java-Klasse der Hauptaktivität müssen Sie in der XML-Datei der Hauptaktivität die Registerkarten an Ihre Situation anpassen (z. B. TabItems hinzufügen oder entfernen). Wenn Sie im XML der Hauptaktivität keine Registerkarten haben, haben Sie möglicherweise nicht den richtigen Aktivitätstyp ausgewählt, als Sie ihn erstellt haben (neue Aktivität - Aktivität mit Registerkarten).
Bitte beachten Sie, dass ich in den letzten 3 Absätzen über das Video spreche! Wenn ich also XML für Hauptaktivität sage, ist es das XML für Hauptaktivität im Video, in Ihrer Situation die MotherActivity XML-Datei.