У меня есть FragmentActivity, который заменяет фрагмент differents для отображения информации. Один из этих фрагментов (StepTwoAddressFragment) имеет карту, содержащуюся в ее макете. В первый раз этот фрагмент правильно рисует представления, но когда я возвращаюсь к этому фрагменту в стеке, приложение падает. Мне нужно добавить этот фрагмент в стек фрагмента.Разбивка фрагмента карты класса при возврате к предыдущему фрагменту карты
android.view.InflateException: Binary XML файл строка # 9: Ошибка фрагмент класса накачивания
FragmentActivity
switch (mCurrentSection) {
case SECTION_STEP_TWO_MAPS_ADDRESS:
SelectNewPositionFragment fragm = SelectNewPositionFragment.newInstance();
mCurrentFragment = fragm;
break;
case SECTION_STEP_TWO_ADDRESS:
mCurrentFragment = StepTwoAddressFragment.newInstance();
break;
case SECTION_STEP_TWO_WHY_GO:
mCurrentFragment = StepTwoWhyGoFragment.newInstance();
break;
}
if (mCurrentFragment != null) {
FragmentTransaction ft = mFragmentManager.beginTransaction().replace(R.id.main_content_frame, mCurrentFragment);
if (hasToAddToBackStack()) {
ft.addToBackStack(null);
}
ft.commit();
}
private boolean hasToAddToBackStack() {
return mCurrentSection != SECTION_STEP_TWO_MAPS_ADDRESS || mCurrentSection != SECTION_STEP_TWO_ADDRESS;
}
fragment_selected_new_position_layout.xml
................
<fragment
android:id="@+id/map"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
................
SelectNewPositionFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
v = inflater.inflate(R.layout.fragment_selected_new_position_layout, container, false);
//mapFragment = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map));
mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
map = mapFragment.getMap();
}
@Override
public void onDestroyView() {
super.onDestroyView();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
if (mapFragment.isResumed()) {
ft.remove(mapFragment);
ft.commit();
}
}
Я попробовал этот код тоже:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.map, container, false);
} catch (InflateException e) {
/* map is already there, just return view as it is */
}
return view;
}
РЕШЕНИЕ изменить вид фрагмента в макете и изменить его с FrameLayout
<FrameLayout
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
и Я создаю новый класс MapBaseFragment, который расширяет SupportMapFrag и инициализирует карту.
public class MapBaseFragment extends SupportMapFragment {
...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setUpMap();
}
...
}
и фрагмент, который содержит карту на
mapFragment = new MapBaseFragment();
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.replace(R.id.map, mapFragment);
ft.commit();
Наконец, удалите код onDestroyView.
Это правильно для меня.