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?

Eugene
quelle
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);
}
Pikaling
quelle
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);
mike.tihonchik
quelle
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);
}
Sakthimuthiah
quelle
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
Anand Savjani
quelle
Wo bekomme ich viewID?
Hoo
@Hoo: Bitte geben Sie Ihre Frage an, was Sie stellen möchten
Anand Savjani
können Sie mir helfen? stackoverflow.com/questions/32983033/…
Hoo
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");
}
Micer
quelle
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>
Sumedh Ulhe
quelle
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);
WO König
quelle
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");
 }
Marium Jawed
quelle
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;
    }


}
Volverine
quelle
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

Pesa
quelle