2015-02-04 3 views
0

У меня есть 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.

Это правильно для меня.

ответ

0

Вы всегда можете использовать FragmentTransaction.add() вместо FragmentTransaction.replace().

Это будет содержать тот фрагмент, который содержит карту под вашим новым фрагментом.

Возможно, вы захотите установить фон непрозрачным и добавить его в задний стек с помощью FragmentTransaction.addToBackStack()

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