Как использовать методы setArguments() и getArguments() во фрагментах?

У меня есть 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?

8 ответов

Решение

У вас есть метод, который называется getArguments() что принадлежит Fragment учебный класс.

Просто позвони 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");   
     }
}

Например: Добавить данные:-

   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")

В 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");

это так просто

Создание фрагмента правильным способом!

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) Пример кода на фрагментах

Для таких, как я, которые хотят отправлять объекты, отличные от примитивов, поскольку вы не можете создать параметризованный конструктор в своем фрагменте, просто добавьте метод доступа сеттера в свой фрагмент, это всегда работает для меня.

Если вы используете компоненты навигации и навигационный график, создайте такой пакет

      val bundle = bundleOf(KEY to VALUE) // or whatever you would like to create the bundle

затем при переходе к другому фрагменту используйте это:

      findNavController().navigate(
        R.id.action_navigate_from_frag1_to_frag2,
        bundle
    )

и когда вы получаете фрагмент назначения, вы можете получить доступ к этому пакету, используя

      Bundle b = getArguments()// in Java

или же

      val b = arguments// in kotlin

Вызовите getArguments в методе onCreateView()

Другие вопросы по тегам