Подтвердить что ты не робот

Установить аргументы фрагмента из активности

Я хочу передать аргументы из моей активности фрагменту, встроенному в действие. Фрагмент встроен статически в макет xml. Я попытался вызвать setArgument() следующим образом:

setContentView(R.layout.detail_activity);
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
detailFragment.setArguments(getIntent().getExtras());

но уже слишком поздно, потому что setArguments нужно вызывать сразу после создания фрагмента. Единственное, что я видел, это getArguments() и изменение пакета. Любой лучший способ?

4b9b3361

Ответ 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));