Wie übertrage ich einige Daten auf ein anderes Fragment?


194

Wie übertrage ich einige Daten auf eine andere Fragment, mit der es auch extrasgemacht wurde intents?


Ich versuche diese Frage hier zu beantworten . Ich hoffe es funktioniert nicht.
Ozhanli

Antworten:


482

Verwenden Sie a Bundle. Hier ist ein Beispiel:

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

Bundle hat Methoden für viele Datentypen festgelegt. Sehen Sie das

Rufen Sie dann in Ihrem Fragmentdie Daten (z. B. in onCreate()Methode) ab mit:

Bundle bundle = this.getArguments();
if (bundle != null) {
        int myInt = bundle.getInt(key, defaultValue);
}

1
Hallo danke für deine Antwort, aber müssen wir irgendetwas implementieren? Wie Serializable oder Parcelable?
Ankit Srivastava

Nein, Sie müssen keine Klassen implementieren.
Gene

2
Möchten Sie möglicherweise einen Scheck hinzufügen, um dieses Bundle zu sehen! = Null, bevor Sie versuchen, etwas daraus zu machen?
Niels

Und wenn Sie ein vorhandenes Fragment im Speicher haben?
Pulver366

Dies ist Code nicht funktioniert, nicht Aktivität umzuleiten, um mit Daten zu fragmentieren
Venkatesh

44

Um die vorherige Antwort noch weiter zu erweitern, müssen Sie, wie Ankit sagte, für komplexe Objekte Serializable implementieren. Zum Beispiel für das einfache Objekt:

public class MyClass implements Serializable {
    private static final long serialVersionUID = -2163051469151804394L;
    private int id;
    private String created;
}

In dir FromFragment:

Bundle args = new Bundle();
args.putSerializable(TAG_MY_CLASS, myClass);
Fragment toFragment = new ToFragment();
toFragment.setArguments(args);
getFragmentManager()
    .beginTransaction()
    .replace(R.id.body, toFragment, TAG_TO_FRAGMENT)
    .addToBackStack(TAG_TO_FRAGMENT).commit();

in Ihrem ToFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

    Bundle args = getArguments();
    MyClass myClass = (MyClass) args
        .getSerializable(TAG_MY_CLASS);

Du bist der Beste. Danke
Hash

1
@Sameera Normalerweise füge ich einfach einen String mit meiner Fragmentklasse ein, dh wenn ich die Klasse MyFragmentIMGoingTo.java habe, dann ist mein TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
Mike.tihonchik

Verwenden Sie Parcelable besser, da Google es als optimierte Serialisierungstechnik für das Android-Betriebssystem empfohlen hat.
Gem

16

getArguments () gibt null zurück, weil "es bekommt nichts"

Versuchen Sie diesen Code, um diese Situation zu behandeln

if(getArguments()!=null)
{
int myInt = getArguments().getInt(key, defaultValue);
}

Hallo danke für deine Antwort, aber müssen wir irgendetwas implementieren? Wie Serializable oder Parcelable?
Ankit Srivastava

Sind Sie sicher, weil ich Serializable / Parcelable implementieren musste, als ich komplexe Daten zwischen einem Fragment und einer Aktivität mit Absicht übergab ......
Ankit Srivastava

Ich habe es nur mit einfachen Werten versucht. Keine Ahnung von Serializable oder Parcelable sorry
Sakthimuthiah

1
Es sollte ein Kommentar sein, keine Antwort !!
Gem

14

Vollständiger Code zum Übergeben von Daten mithilfe von Fragment zu Fragment

Fragment fragment = new Fragment(); // replace your custom fragment class 
Bundle bundle = new Bundle();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                bundle.putString("key","value"); // use as per your need
                fragment.setArguments(bundle);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.replace(viewID,fragment);
                fragmentTransaction.commit();

In der benutzerdefinierten Fragmentklasse

Bundle mBundle = new Bundle();
mBundle = getArguments();
mBundle.getString(key);  // key must be same which was given in first fragment

Wo bekomme ich viewID?
Hoo

@Hoo: Bitte geben Sie Ihre Frage an, was Sie stellen möchten
Anand Savjani


5

Nur um frühere Antworten zu erweitern - es könnte jemandem helfen. Wenn Sie getArguments()zurückkehren null, setzen Sie es auf die onCreate()Methode und nicht auf den Konstruktor Ihres Fragments:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int index = getArguments().getInt("index");
}

1
            First Fragment Sending String To Next Fragment
            public class MainActivity extends AppCompatActivity {
                    private Button Add;
                    private EditText edt;
                    FragmentManager fragmentManager;
                    FragClass1 fragClass1;


                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        Add= (Button) findViewById(R.id.BtnNext);
                        edt= (EditText) findViewById(R.id.editText);

                        Add.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                fragClass1=new FragClass1();
                                Bundle bundle=new Bundle();

                                fragmentManager=getSupportFragmentManager();
                                fragClass1.setArguments(bundle);
                                bundle.putString("hello",edt.getText().toString());
                                FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                                fragmentTransaction.add(R.id.activity_main,fragClass1,"");
                                fragmentTransaction.addToBackStack(null);
                                fragmentTransaction.commit();

                            }
                        });
                    }
                }
         Next Fragment to fetch the string.
            public class FragClass1 extends Fragment {
                  EditText showFrag1;


                    @Nullable
                    @Override
                    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

                        View view=inflater.inflate(R.layout.lay_frag1,null);
                        showFrag1= (EditText) view.findViewById(R.id.edtText);
                        Bundle bundle=getArguments();
                        String a=getArguments().getString("hello");//Use This or The Below Commented Code
                        showFrag1.setText(a);
                        //showFrag1.setText(String.valueOf(bundle.getString("hello")));
                        return view;
                    }
                }
    I used Frame Layout easy to use.
    Don't Forget to Add Background color or else fragment will overlap.
This is for First Fragment.
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="@color/colorPrimary"
        tools:context="com.example.sumedh.fragmentpractice1.MainActivity">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/editText" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:id="@+id/BtnNext"/>
    </FrameLayout>


Xml for Next Fragment.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
   android:background="@color/colorAccent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtText"/>

</LinearLayout>

3
Erkläre deine Antwort? Code ohne Erklärung wird nicht viel helfen
Coder

Ich habe Code in einem Fluss geschrieben, damit er verstanden werden kann. Übergeben von Daten von der Hauptaktivität an FragClass1 unter Verwendung eines Bundles.
Sumedh Ulhe

1

Aus der Aktivitätsklasse:

Senden Sie die Daten mithilfe von Bundle-Argumenten an das Fragment und laden Sie das Fragment

   Fragment fragment = new myFragment();
   Bundle bundle = new Bundle();
   bundle.putString("pName", personName);
   bundle.putString("pEmail", personEmail);
   bundle.putString("pId", personId);
   fragment.setArguments(bundle);

   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    fragment).commit();

Aus der myFragment-Klasse:

Holen Sie sich die Argumente aus dem Bundle und setzen Sie sie auf xml

    Bundle arguments = getArguments();
    String personName = arguments.getString("pName");
    String personEmail = arguments.getString("pEmail");
    String personId = arguments.getString("pId");

    nameTV = v.findViewById(R.id.name);
    emailTV = v.findViewById(R.id.email);
    idTV = v.findViewById(R.id.id);

    nameTV.setText("Name: "+ personName);
    emailTV.setText("Email: "+ personEmail);
    idTV.setText("ID: "+ personId);

Bitte lesen Sie die Frage noch einmal, es geht um Fragment zu Fragment
Amin Pinjari

1

So verwenden Sie Bundle:

Bundle b = new Bundle();
b.putInt("id", id);
Fragment frag= new Fragment();
frag.setArguments(b);

Wert aus dem Bundle abrufen:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }

0

Ihr Eingabefragment

public class SecondFragment extends Fragment  {


    EditText etext;
    Button btn;
    String etex;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.secondfragment, container, false);
        etext = (EditText) v.findViewById(R.id.editText4);
        btn = (Button) v.findViewById(R.id.button);
        btn.setOnClickListener(mClickListener);
        return v;
    }

    View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            etex = etext.getText().toString();
            FragmentTransaction transection = getFragmentManager().beginTransaction();
            Viewfragment mfragment = new Viewfragment();
            //using Bundle to send data
            Bundle bundle = new Bundle();
            bundle.putString("textbox", etex);
            mfragment.setArguments(bundle); //data being send to SecondFragment
            transection.replace(R.id.frame, mfragment);
            transection.isAddToBackStackAllowed();
            transection.addToBackStack(null);
            transection.commit();

        }
    };



}

Ihr Ansichtsfragment

public class Viewfragment extends Fragment {

    TextView txtv;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.viewfrag,container,false);
        txtv = (TextView)  v.findViewById(R.id.textView4);
        Bundle bundle=getArguments();
        txtv.setText(String.valueOf(bundle.getString("textbox")));
        return v;
    }


}

0

Wenn Sie ein Diagramm für die Navigation zwischen Fragmenten verwenden, können Sie Folgendes tun: Aus Fragment A:

    Bundle bundle = new Bundle();
    bundle.putSerializable(KEY, yourObject);
    Navigation.findNavController(view).navigate(R.id.contactExtendedFragment, bundle);

So fragmentieren Sie B:

    Bundle bundle = getArguments();
    contact = (DISContact) bundle.getSerializable(KEY);

Natürlich muss Ihr Objekt Serializable implementieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.