2012-04-12 4 views
19

У меня есть три фрагмента, как показано на рисунке ниже. Я добавил все эти три фрагмента в LinearLayout, используя .xml-файл, и когда запускается моя активация запуска, я загружаю этот макет .xml с помощью setContentView.

У меня есть некоторые элементы управления на фрагменте2. Нажав на кого-нибудь, загрузите программный код с помощью метода FragmentTransaction и commit. Эти фрагменты добавляются к экрану, но проблема заключается в том, что фрагмент4 с программным добавлением занимает всю площадь экрана. В чем проблема?

Примечание: на любой элемент нажмите на f2. Я хочу заменить только f2 новым фрагментом f4. Имейте в виду, что я добавил файл макета f1, f2, f3 через xml и добавив новый фрагмент f4 программно.

enter image description hereЗаменить фрагмент программно

+0

Непонятно. Вы показываете все четыре фрагмента вместе в конце.? –

ответ

33

Вы всегда должны добавлять, удалять и заменять фрагменты программным путем. Поэтому я предлагаю вам заменить ваши фрагменты F-1, F-2 и F-3 контейнерами, такими как FrameLayout.

В основном вместо элемента <fragment/> в качестве F-1 вы делаете его элементом <FrameLayout/>. Затем выполнить транзакцию фрагмент в OnCreate вашей FragmentActivity в:

Fragment1 f1 = new Fragment1(); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 

Теперь предположим, что вы сделали это для F-1, F-2 и F-3. Затем вы заменяете f2 на f4, повторив то же самое в своем OnClickListener:

public void onClick(View v) { 
    Fragment4 f4 = new Fragment4(); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 
+0

Есть ли у вас какие-либо ссылки, чтобы я мог взять пример оттуда? – MobiDev

+1

Я отредактировал свой ответ. Это должно решить вашу проблему. – CodePrimate

+1

Спасибо. ОК, что я понимаю, не помещайте фрагменты непосредственно в макет xml. Поместите фреймэлей вместо фрагментных элементов. И при замене f4 на f2 используйте фрейм f2. Я прав? Вы можете дать ссылку на сайт, чтобы проверить это. – MobiDev

2

Храните только FrameLayout в качестве заполнителей для фрагмента в XML. В OnCreate загружаются фрагменты в framelayout. OnClick фрагмента, укажите, что конкретный идентификатор FrameLayout заменяется на Fragment4.

Смежные вопросы