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