Як використовувати методи setArguments () та getArguments () у фрагментах?


98

У мене є 2 фрагменти: (1) Frag1 (2) Frag2.

Frag1

bundl = new Bundle();
bundl.putStringArrayList("elist", eList);

Frag2 dv = new Frag2();
dv.setArguments(bundl);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.the_fragg,dv);
ft.show(getFragmentManager().findFragmentById(R.id.the_fragg)); 
ft.addToBackStack(null);
ft.commit();

Як отримати ці дані в Frag2?

Відповіді:


26

У вас є метод, який називається, getArguments()що належить до Fragmentкласу.


192

Просто зателефонуйте getArguments()в ваш Frag2«S onCreateView()метод:

public class Frag2 extends Fragment {

     public View onCreateView(LayoutInflater inflater,
         ViewGroup containerObject,
         Bundle savedInstanceState){
         //here is your arguments
         Bundle bundle=getArguments(); 

        //here is your list array 
        String[] myStrings=bundle.getStringArray("elist");   
     }
}

12
У моєму випадку це нульове значення, будь-яка ідея, чому це відбувається?
Аніруд

2
Ви кладете ArrayList в пакет, але отримуєте String Array. Ви повинні зробитиbundle.getStringArrayList("elist");
Рафал

1
Ви забули заяву про повернення:return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
Постійний перегляд дзвінків постійно. Тому просто називайте гетаргументи методом oncreate (). Він зателефонує лише тоді, коли фрагмент буде знищений або новостворений час.
Мохаммед Ібрагім

5
@almaz_from_kazan @HabeebPerwad Чому ви використовуєте getArguments() в onCreateView, що не onCreate?
Нік Кобер

38

Напр .: додавання даних: -

   Bundle bundle = new Bundle();
   bundle.putString("latitude", latitude);
   bundle.putString("longitude", longitude);
   bundle.putString("board_id", board_id);
   MapFragment mapFragment = new MapFragment();
   mapFragment.setArguments(bundle);

Наприклад: Отримати дані: -

String latitude =  getArguments().getString("latitude")

7

у Frag1:

Bundle b = new Bundle();

b.putStringArray("arrayname that use to retrive in frag2",StringArrayObject);

Frag2.setArguments(b);

у Frag2:

Bundle b = getArguments();

String[] stringArray = b.getStringArray("arrayname that passed in frag1");

Це так просто.


5

Моментальний фрагмент правильним способом!

getArguments() setArguments()методи здаються дуже корисними, коли мова йде про інстанціювання фрагмента за допомогою статичного методу.
тобтоMyfragment.createInstance(String msg)

Як це зробити?

Код фрагмента

public MyFragment extends Fragment {

    private String displayMsg;
    private TextView text;

    public static MyFragment createInstance(String displayMsg)
    {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.setString("KEY",displayMsg);
        fragment.setArguments(args);           //set
        return fragment;
    }

    @Override
    public void onCreate(Bundle bundle)
    {
        displayMsg = getArguments().getString("KEY"):    // get 
    }

    @Override
    public View onCreateView(LayoutInlater inflater, ViewGroup parent, Bundle bundle){
        View view = inflater.inflate(R.id.placeholder,parent,false);
        text = (TextView)view.findViewById(R.id.myTextView);
        text.setText(displayMsg)    // show msg
        returm view;
   }

}

Скажімо, ви хочете передати рядок під час створення екземпляра. Ось як ви це зробите.

MyFragment.createInstance("This String will be shown in textView");

Детальніше

1) Чому Myfragment.getInstance (String msg) віддається перевагу перед новим MyFragment (String msg)?
2) Зразок коду на фрагменти


android.os.Bundle не має встановленняString. Ви маєте на увазі putString ()?
Стелс-раббі

2

для таких, як я, які хочуть надсилати інші об'єкти, крім примітивів, оскільки ви не можете створити у своєму фрагменті параметризований конструктор, просто додайте в свій фрагмент акселератор, це завжди працює для мене.


Це неправильний шлях. Якщо фрагмент відтвориться, він втратить ці параметри. Параметри, надіслані фрагменту, повинні бути серіалізаційними, пропущеними setArguments(). Несеріалізаційні параметри можна встановити за допомогою сеттера, але його слід знову викликати при відтворенні активності / фрагменту.
CoolMind
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.