Как использовать методы 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?

Android_programmer_camera
источник

Ответы:

26

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

codeScriber
источник
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
В моем случае он возвращает null, есть идеи, почему это происходит?
Anirudh 01
2
Вы помещаете ArrayList в пакет, но получаете массив String. Вы должны сделатьbundle.getStringArrayList("elist");
Рафал
1
Вы забыли инструкцию возврата:return super.onCreateView(inflater, container, savedInstanceState);
user41805 01
4
Oncreateview все время звонит. Поэтому просто вызовите getarguments в методе 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 не имеет setString. Вы имеете в виду putString ()?
Stealth Rabbi
2

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

Мина Габриэль
источник
Это неправильный путь. Если фрагмент воссоздается, он потеряет эти параметры. Параметры, отправленные во фрагмент, должны быть сериализуемыми, передаваемыми setArguments(). Несериализуемые параметры могут быть установлены с помощью установщика, но его следует снова вызывать при воссоздании активности / фрагмента.
CoolMind 06