Если я объявляю фрагмент в XML-макете, как передать его Bundle?

У меня есть действие, которое я заменил фрагментом. Эта деятельность приняла намерение, в котором была дополнительная информация о том, какие данные должна была отображаться.

Теперь, когда моя активность – это всего лишь обертка вокруг фрагмента, которая выполняет ту же работу, как мне получить этот пакет для фрагмента, если я объявляю фрагмент в XML с тегом?

Если бы я использовал FragmentTransaction, чтобы поместить Fragment в ViewGroup, я бы получил возможность передать эту информацию в конструкторе фрагмента, но мне интересно о ситуации, когда фрагмент определен в XML.

Теперь, когда моя активность – это всего лишь обертка вокруг фрагмента, которая выполняет ту же работу, как мне получить этот пакет для фрагмента, если я объявляю фрагмент в XML с тегом?

Вы не можете.

Однако вы можете вызвать findFragmentById() в FragmentManager для извлечения фрагмента после инфляции, а затем вызвать некоторый метод для фрагмента для связывания данных с ним. Хотя, по-видимому, не может быть установлено setArguments() , ваш фрагмент может организовать хранение данных непосредственно после изменения конфигурации другими способами ( onSaveInstanceState() , setRetainInstance(true) и т. Д.).

Это не инкапсулированный путь, но я закончил «вытягивание» пакета из родительской активности:

 Bundle bundle = getActivity().getIntent().getExtras(); 

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

  <LinearLayout android:id="@+id/fragment_container" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" /> 

А затем в вашем классе Activity вы программно раздуваете макет с помощью фрагмента. Таким образом, вы можете передавать параметры с помощью args.

  FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment fragment = MyFragment.newInstance(); Bundle args = new Bundle(); args.putInt(Global.INTENT_INT_ROLE, 1);' fragment.setArguments(args); fragmentTransaction.add(R.id.fragment_container, fragment, "MyActivity"); fragmentTransaction.commit(); 

Этот подход не так чист и прост, как объявление его в xml, но я перешел к нему, поскольку он дает вам намного больше контроля над фрагментом.

Единственное решение, которое я вижу, – не использовать аргументы в качестве канала обмена данными. Вместо этого сделайте свой фрагмент, чтобы получить необходимую информацию из других источников. Перезвоните, чтобы получить правильную активность, проконсультироваться с памятью временного хранения, объектом Singleton и т. Д.

Другим решением, которое может быть полезно, является использование фреймворков, которые позволяют несвязанным объектам обмениваться сообщениями по шаблону проектирования Медиатора, как Отто .