Добавление фрагмента в ViewGroup - PullRequest
4 голосов
/ 21 августа 2011

В руководстве разработчика сказано, что Fragment может быть добавлен программно во время выполнения к существующему ViewGroup.У меня вопрос: как это ViewGroup связано с приложением?

До сих пор я пытался объявить ViewGroup в XML-файлах, описывающих макет моего приложения.Но когда я пытаюсь добавить Fragment к нему с помощью функции public abstract FragmentTransaction add (int containerViewId, Fragment fragment, String tag), мое приложение падает (не сразу, а в конце функции onCreate моего приложения).

Что я на самом делеЯ хочу управлять несколькими представлениями (реализованными как Fragment) в моем приложении и переключаться между ними в соответствии с выбором пользователя.Что я должен добавить (или изменить) в моем подходе?

Заранее благодарим за потраченное время, пытаясь помочь мне.

Ответы [ 2 ]

5 голосов
/ 23 августа 2011

ViewGroup может быть простой компоновкой фрейма

<FrameLayout
android:id="@+id/fragmentForChange"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

Затем для замены этого фрейма на ваш фрагмент вам нужно сделать nex:

Bundle args = new Bundle();        
// add needed args

//create fragment and set arguments    
Fragment fragment= MyFragment();
fragment.setArguments(args)

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// getSupportFragmentManager - uses for compatible library instead of getFragmentManager

//replace frame with our fragment
ft.replace(R.id.fragmentForChange,fragment);
//set type of animation
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

//finish transaction
ft.commit();

Вы можете скрыть или показать фрагменты в транзакции с помощью команды:

ft.hide(fragment);        
ft.show(fragment);        
1 голос
/ 25 октября 2011

Я не знаю, в чем причина вашего сбоя, поскольку вы не предоставили подробностей, просто отправили вам совет (это сработало для меня, и это не так очевидно, так как API Fragment не слишком интуитивно понятен в использовании).

Имейте в виду, что Fragment, созданный в FragmentTransaction, добавляется не сразу, а по собственному усмотрению (позже, вероятно, когда поток пользовательского интерфейса не занят), поэтому вызов GetView () Fragment может вернутьсяв течение некоторого времени, что может быть причиной сбоя.

Мне не понятно, почему Google разработал его таким образом, поскольку остальная часть API является синхронной и - что еще более запутанно - если вы создаете Fragment как часть вашего XML-макета (используя inflater), то онтакже создается синхронно, и getView всегда возвращает значение.

Это возможное решение: если вы создаете свою ViewGroup как часть процесса раздувания компоновки, это может сработать для вас.

...