2013-08-08 3 views
19

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

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

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

+0

Я предлагаю вам обратиться http://stackoverflow.com/a/ 12739968/1554935 –

+1

Нет, они создают фрагмент программно, а мой фрагмент является частью xml. – damluar

+0

У меня такая же проблема. Примеры. Я видел, как все добавляли фрагменты в контейнеры активности. –

ответ

33

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

  1. Имейте действие, реализующее прослушиватель событий фрагмента. Попросите фрагмент запросить необходимые параметры из Activity при создании или когда это необходимо. Communication with Fragment
  2. Создайте пользовательские атрибуты, которые могут быть встроены в xml вместе с фрагментом. Затем во время процесса взлома фрагмента проанализируйте пользовательские атрибуты для получения их данных. Custom fragment attributes
  3. Создайте публичные сеттеры в фрагменте и используйте их непосредственно. Если важно установить их до метода onCreate() фрагмента, сделайте это с помощью метода активности onAttachFragment().
+2

'onAttachFragment()' отличный совет. Благодаря! –

+0

Это отличный ответ, почему он не принят? Хотя он должен добавить, что это обходные ситуации, и если фрагмент не является статичным и автономным, рекомендуется использовать этот фрагмент в представлении контейнера, определяемом Activity # setContentView – 43matthew

+1

onAttachFragment() не вызывается. Я что-то пропустил? – clu

5

У вас есть два варианта здесь

  1. Если вам просто нужна информация в намерении своей деятельности, а затем размещение информации от намерения в аргументы фрагмента просто добавляет ненужный шаг. Вы можете просто хорошо держать вещи простыми и от вашего фрагмента вызова

    Bundle data = getActivity().getIntent().getExtras(); 
    
  2. Если вам нужно добавить информацию, которая не в намерениях своей деятельности в то в вас фрагмент не создать не конструктор параметров, как:

    public DetailFragment() { 
        this.setArguments(new Bundle()); 
    } 
    

то в вашей деятельности вы можете добавить любые аргументы, вам нужно с кодом, как:

DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment); 
    frg.getArguments().putBundle("key", data); 

здесь следует использовать существующий объект пакета, а не пытаться вызвать setArguments() после присоединения фрагмента к активности.

+0

The putBundle находится после setContentView, не так ли? Таким образом, фрагмент создается до того, как мы добавим пакет. Нужно ли обновлять фрагмент? Благодарю. – stenlytw

4

Другой способ передать данные фрагмента выглядит следующим образом:

//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 внутри деятельности

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)); 
Смежные вопросы