Як перенести деякі дані на інший фрагмент?


194

Як передати деякі дані іншому Fragmentтак само, як це було зроблено extrasдля intents?


Я намагаюся відповісти на це питання @ тут . Я сподіваюся, що т працює.
ожанлі

Відповіді:


482

Використовуйте a Bundle. Ось приклад:

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

Пакет додав методи для безлічі типів даних. Дивіться це

Потім виберіть Fragmentсвої дані (наприклад, у onCreate()методі) за допомогою:

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

1
Привіт, дякую за вашу відповідь, але чи потрібно нам реалізовувати що-небудь подібне як серіалізаційний чи парцелябельний?
Ankit Srivastava

Ні, вам не потрібно реалізовувати жодні заняття.
Гена

2
Можливо, ви хочете додати чек, щоб побачити цей пакет! = Нуль, перш ніж ви намагатиметесь вийти з нього щось?
Нільс

А якщо у вас є наявний фрагмент у пам’яті?
порошок366

це код не працює, не перенаправляє активність до фрагменту з даними
Venkatesh

44

Щоб ще більше розширити попередню відповідь, як казав Анкіт, для складних об'єктів потрібно реалізувати Serializable. Наприклад, для простого об'єкта:

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

У вас 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();

у вашому ToFragment:

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

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

Ви найкращі. Дякую
хеш

1
@Sameera Я просто проставляю рядок із своїм класом фрагментів, тобто якщо у мене є клас MyFragmentIMGoingTo.java, то мій TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik

Краще використовувати Parcelable, оскільки Google рекомендував його як оптимізовану техніку серіалізації для операційної системи Android.
Джем

16

getArguments () повертається до нуля, оскільки "Його нічого не отримує"

Спробуйте цей код, щоб вирішити цю ситуацію

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

Привіт, дякую за вашу відповідь, але чи потрібно нам реалізовувати що-небудь подібне як серіалізаційний чи парцелябельний?
Ankit Srivastava

Ви впевнені? тому що мені довелося реалізувати Serializable / Parcelable, коли я передавав складні дані між фрагментом та діяльністю за допомогою намірів ......
Ankit Srivastava

я намагався тільки з простими значеннями. Поняття про серіалізаційну або розбірливу шкода немає
Сактімутія

1
Це повинен бути коментар не відповісти !!
Gem

14

Повний код передачі даних, використовуючи фрагмент до фрагменту

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();

У спеціальному класі фрагмента

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

де взяти viewID?
Hoo

@Hoo: будь ласка, вкажіть своє запитання, що ви хочете задати
Anand Savjani

можеш допомогти мені? stackoverflow.com/questions/32983033/…
Hoo

5

Просто розширити попередні відповіді - це може комусь допомогти. Якщо ви getArguments()повертаєтеся null, поставте його до onCreate()методу, а не до конструктора вашого фрагмента:

@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
Поясніть свою відповідь? код без будь-яких пояснень не допоможе багато
Coder

Я написав код у потоці, щоб його можна було зрозуміти ..... Передача даних з основної діяльності до FragClass1 з використанням пакету.
Sumedh Ulhe

1

З класу активності:

Надішліть дані за допомогою аргументів пакету до фрагменту та завантажте фрагмент

   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();

З класу myFragment:

Отримайте аргументи з групи та встановіть їх у 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);

Прочитайте ще раз питання, йдеться про фрагмент до фрагмента
Амін Пінджарі

1

Ось як ви використовуєте пакет:

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

отримати значення з пакета:

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

0

Ваш вхідний фрагмент

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();

        }
    };



}

фрагмент перегляду

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

Якщо ви використовуєте графік для навігації між фрагментами, ви можете це зробити: З фрагмента A:

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

До фрагменту B:

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

Звичайно, ваш об'єкт повинен реалізувати Serializable

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.