Ich bin ziemlich neu in der Verwendung von Fragmenten.
Ich versuche nur, eine einfache Beispielanwendung zu erstellen, die Fragmente verwendet. Mein Szenario ist, ich habe zwei Aktivitäten mit einem Fragment in jeder Aktivität. Das erste Fragment hat einen Edittext und eine Schaltfläche. Das zweite Fragment hat eine Textansicht. Wenn ich einen Namen in den Edittext eingebe und auf die Schaltfläche klicke, sollte die Textansicht im zweiten Fragment den Namen anzeigen, der im Edittext des ersten Fragments eingegeben wurde.
Ich konnte den Wert vom ersten Fragment an seine Aktivität und dann von dieser Aktivität an die zweite Aktivität senden. Wie verwende ich diesen Wert im zweiten Fragment?
Hier ist der Java-Code :::
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Fragment_1 extends Fragment{
OnFragmentChangedListener mCallback;
// Container Activity must implement this interface
public interface OnFragmentChangedListener {
public void onButtonClicked(String name);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFragmentChangedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);
final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);
btnSayHi_Fragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edtxtPersonName_Fragment.getText().toString();
FragmentManager fm = getFragmentManager();
Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);
Activity activity = getActivity();
if(activity != null)
{
Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
}
if(f2 != null && f2.isInLayout())
{
f2.setName(name);
}
else
{
mCallback.onButtonClicked(name);
}
}
});
return view;
}
}
MainActivity.Java
package com.example.fragmentexample;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Choreographer.FrameCallback;
import android.view.Menu;
public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onButtonClicked(String name) {
// TODO Auto-generated method stub
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("", name);
startActivity(i);
}
}
SecondActivity.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Bundle b = getIntent().getExtras();
Fragment_2 f2 = new Fragment_2();
f2.setArguments(b);
}
}
Fragment_2.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment_2 extends Fragment{
View view;
TextView txtName;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
view = inflater.inflate(R.layout.fragment_fragment_2, container, false);
// Exception at this line
String name = getArguments().getString("message");
txtName = (TextView) view.findViewById(R.id.txtViewResult);
txtName.setText(name);
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
public void setName(String name)
{
txtName.setText("Hi " + name);
}
}
Ich bekomme folgende Ausnahme :::
04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713): at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 21 more
Wie erhalte ich den Wert vom Bundle in SecondActivity.java zum Fragment_2.Java?
quelle
Antworten:
Schritt 1. Daten vom Fragment zur Aktivität senden
Schritt 2. Um diese Daten in Aktivität zu erhalten:
Schritt 3 . Um Daten von einer Aktivität an eine andere Aktivität zu senden, folgen Sie dem normalen Ansatz
Schritt 4 , um diese Daten in Aktivität zu erhalten
Schritt 5. In Aktivität können Sie Daten mit der Absicht an Fragment senden:
und in Fragment in Fragment onCreateView-Methode zu empfangen:
quelle
bundle.putString("message", "From Activity");
Wie auf der Entwicklerseite angegeben
Die Kommunikation zwischen Fragmenten sollte über die zugehörige Aktivität erfolgen.
Lassen Sie uns die folgenden Komponenten haben:
Die Implementierung von FragmentA lautet:
Die Implementierung von MainActivity ist:
Die Implementierung von FragmentB ist:
Ich hoffe das wird helfen ..
quelle
// In Fragment_1.java
// In Fragment_2.java
Hoffe das hilft dir.
quelle
putString
(oderputInt
) ist die Antwort!Von der Entwickler- Website:
Sie können mithilfe der Aktivität zwischen Fragmenten kommunizieren. Mit diesem Ansatz können Sie zwischen Aktivitäten und Fragmenten kommunizieren .
Bitte überprüfen Sie auch diesen Link.
quelle
Zunächst sind alle Antworten richtig. Sie können die Daten mit Ausnahme von benutzerdefinierten Objekten mithilfe von übergeben
Intent
. Wenn Sie die benutzerdefinierten Objekte übergeben möchten, müssen SieSerialazable
oderParcelable
an Ihre benutzerdefinierte Objektklasse implementieren . Ich fand es zu kompliziert ...Wenn Ihr Projekt einfach ist, versuchen Sie es zu verwenden
DataCache
. Das bietet eine super einfache Möglichkeit, Daten zu übergeben. Ref: Github-Projekt CachePot1- Stellen Sie dies auf Ansicht oder Aktivität oder Fragment ein, um Daten zu senden
2- Holen Sie sich Daten wie unten beschrieben
quelle
Die neueste Lösung zum Übergeben von Daten zwischen Fragmenten kann mithilfe von Android-Architekturkomponenten wie ViewModel und LiveData implementiert werden. Mit dieser Lösung müssen Sie keine Schnittstelle für die Kommunikation definieren und können die Vorteile der Verwendung von Ansichtsmodellen wie dem Überleben von Daten aufgrund von Konfigurationsänderungen nutzen.
In dieser Lösung teilen sich die an der Kommunikation beteiligten Fragmente dasselbe Ansichtsmodellobjekt, das an ihren Aktivitätslebenszyklus gebunden ist. Das Ansichtsmodellobjekt enthält ein Livedata-Objekt. Ein Fragment legt Daten fest, die an das Livedata-Objekt übergeben werden sollen, und der zweite Fragmentbeobachter ändert die Livedata-Daten und empfängt die Daten.
Hier ist das vollständige Beispiel http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
quelle
Argumente zwischen Fragmenten übergeben. Dies ist ziemlich spät, um diese Frage zu beantworten, aber es könnte jemandem helfen!
Fragment_1.java
Dann können
Fragment_2.java
Sie in Ihrem die Parameter normalerweise innerhalb IhresonActivityCreated
zquelle
Ich denke, ein guter Weg, um dieses Problem zu lösen, ist die Verwendung einer benutzerdefinierten Oberfläche.
Nehmen wir an, Sie haben zwei Fragmente (A und B), die sich innerhalb derselben Aktivität befinden, und Sie möchten Daten von A nach B senden.
Schnittstelle:
Aktivität:
Fragment A:
Fragment B:
quelle
Die Kommunikation zwischen Fragmenten ist ziemlich kompliziert (ich finde das Listener-Konzept etwas schwierig zu implementieren).
Es ist üblich, einen 'Event Bus' zu verwenden, um diese Kommunikationen zu abstrahieren. Dies ist eine Bibliothek eines Drittanbieters, die diese Kommunikation für Sie erledigt.
'Otto' wird häufig verwendet, um dies zu tun, und es könnte sich lohnen, einen Blick darauf zu werfen : http://square.github.io/otto/
quelle
Übergeben von Daten vom Fragment an ein anderes Fragment
Vom ersten Fragment
Auf dem zweiten Fragment
quelle
Diese einfache Implementierung hilft dabei, Daten auf einfache Weise zwischen Fragmenten zu übertragen. Denken Sie, Sie möchten Daten von 'Frgement1' an 'Fragment2' übergeben.
In Fragment1 (Zu sendende Daten festlegen)
In Fragment2 onCreateView-Methode (Get-Parameter)
quelle
Kotlin Weg
Verwenden Sie einen
SharedViewModel
Vorschlag in der offiziellen ViewModel- DokumentationImplementieren Sie zuerst fragment-ktx , um Ihr Ansichtsmodell einfacher zu instanziieren
Dann müssen Sie nur noch die Daten in das Ansichtsmodell einfügen, die Sie mit dem anderen Fragment teilen möchten
Zum Abschluss instanziieren Sie einfach Ihr viewModel in jedem Fragment und legen den Wert von fest
selected
aus dem Fragment fest, für das Sie die Daten festlegen möchtenFragment A.
Warten Sie dann einfach an Ihrem Fragment-Ziel auf diesen Wert
Fragment B.
Sie können es auch umgekehrt machen
quelle
100% funktionierende Lösung: (Wenn Sie Hilfe haben, vergessen Sie nicht, die positive Bewertung abzugeben.)
Fügen Sie in Ihr erstes Fragment diesen Code ein:
Machen Sie im zweiten Fragment die folgende Methode:
Definieren Sie dann eine Variable auf Klassenebene:
Machen Sie dann eine andere Methode im zweiten Fragment, um den Wert festzulegen:
quelle
Sie können Ihr Ziel mit ViewModel und Live Data erreichen, die von Arnav Rao gelöscht wurden . Jetzt habe ich ein Beispiel gegeben, um es sauberer zu machen.
Zunächst wird die Annahme
ViewModel
benanntSharedViewModel.java
.Dann ist das Quellfragment das,
MasterFragment.java
von dem aus wir Daten senden möchten.Und schließlich ist das Zielfragment der Ort,
DetailFragment.java
an dem wir die Daten empfangen möchten.quelle
OK, nachdem ich so viel hier gegraben habe, habe ich eine einfache Lösung gefunden. Eigentlich sollten Sie die Daten niemals von Fragment zu Fragment weitergeben. Es ist immer eine schlechte Idee. Sie können Daten von Fragment A an Aktivität übergeben und die Daten von Aktivität in Fragment B abrufen.
// in der Hauptaktivität
// jetzt in FragmentB
quelle
Ich habe Anfängern wie mir etwas wirklich Leichtes gemacht. Ich habe eine Textansicht in meiner activity_main.xml erstellt und eingefügt
dann bekomme ich diese textansicht aus dem ersten fragment
und dann im zweiten Fragment bekomme ich den Wert
ich hoffe es hilft!
quelle