У меня есть три фрагмента, как показано на рисунке ниже. Я добавил все эти три фрагмента в LinearLayout, используя .xml файл, и когда запускается моя активация запуска, я загружаю этот макет .xml с помощью setContentView.
У меня есть некоторые элементы управления для фрагмента2. Нажатие на кого-либо загружает
фрагмент4 программным способом с использованием метода FragmentTransaction и commit. Эти фрагменты добавляются к экрану, но проблема заключается в том, что фрагмент4 с программным добавлением занимает всю площадь экрана. В чем может быть проблема?
Примечание. Для любого элемента нажмите на f2. Я хочу заменить только f2 новым фрагментом f4. Имейте в виду, что я добавил файл макета f1, f2, f3 через xml и программно добавил новый фрагмент f4.
Заменить фрагмент программно
Ответ 1
Вы всегда должны добавлять, удалять и заменять свои фрагменты программно. Поэтому я предлагаю вам заменить фрагменты F-1, F-2 и F-3 на контейнеры, такие как FrameLayout.
В основном вместо того, чтобы иметь элемент <fragment/>
как F-1, вы делаете его элементом <FrameLayout/>
. Затем вы выполняете транзакцию фрагментов в своем FragmentActivity onCreate:
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();
}
Ответ 2
Храните только FrameLayout в качестве заполнителей для фрагмента в XML. В OnCreate загружаются фрагменты в framelayout. OnClick фрагмента, дайте этому конкретному идентификатору FrameLayout заменить на Fragment4.