Установить аргументы фрагмента из активности
Я хочу передать аргументы из моей активности фрагменту, встроенному в действие. Фрагмент встроен статически в макет xml.
Я попытался вызвать setArgument() следующим образом:
setContentView(R.layout.detail_activity);
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
detailFragment.setArguments(getIntent().getExtras());
но уже слишком поздно, потому что setArguments нужно вызывать сразу после создания фрагмента. Единственное, что я видел, это getArguments() и изменение пакета. Любой лучший способ?
Ответы
Ответ 1
AFAIK, вы не можете использовать setArguments()
, как это, когда вы встраиваете фрагмент в XML. Если это критически важно, вам лучше будет динамически добавлять фрагмент. Однако, если вы действительно хотите, чтобы фрагмент был встроен через XML, существуют разные способы передачи этих данных.
- Попросите объект реализовать прослушиватель событий фрагмента. Попросите фрагмент запросить необходимые параметры из Activity при создании или когда это необходимо. Связь с фрагментом
- Создайте настраиваемые атрибуты, которые могут быть встроены в xml вместе с фрагментом. Затем, во время процесса фрагментации инфляции, проанализируйте пользовательские атрибуты для получения их данных. Пользовательские атрибуты фрагментов
- Создать публичные сеттеры в фрагменте и использовать их непосредственно. Если это важно, чтобы установить их до метода фрагмента
onCreate()
, тогда сделайте это из метода onAttachFragment()
.
Ответ 2
Здесь у вас есть два варианта
-
Если вам просто нужна информация в намерении деятельности, то размещение информации из намерения в аргументы фрагмента просто добавляет ненужный шаг. Вы можете просто сохранить вещи просто и от вашего вызова фрагмента
Bundle data = getActivity().getIntent().getExtras();
-
Если вам нужно добавить информацию, которая не находится в намерении действия, тогда в вашем фрагменте создайте конструктор без параметров, например:
public DetailFragment() {
this.setArguments(new Bundle());
}
то в вашей деятельности вы можете добавить любые аргументы, которые вам нужны с кодом, например:
DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
frg.getArguments().putBundle("key", data);
здесь следует использовать существующий объект пакета, а не пытаться вызвать setArguments() после присоединения фрагмента к активности.
Ответ 3
Другой способ передачи данных в фрагмент выглядит следующим образом:
//In DetailFragment (for Instance) define a public static method to get the instance of the fragment
public static final DetailFragment getInstance(Bundle data) {
DetailFragment fragment = new DetailFragment();
fragment.setArguments(data);
return fragment;
}
И при прикреплении DetailFragment изнутри Activity
Bundle data = new Bundle();
//Add data to this bundle and pass it in getInstance() of DetailFragment
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data));