【问题标题】:Inflating class map fragment error when return to the previous map fragment返回上一个地图片段时膨胀类地图片段错误
【发布时间】:2015-02-04 08:51:34
【问题描述】:

我有一个 FragmentActivity 替换不同的片段来显示信息。其中一个片段 (StepTwoAddressFragment) 的布局中包含一个地图。第一次,这个片段正确地绘制了视图,但是当我回到堆栈中的这个片段时,应用程序崩溃了。我需要将此片段添加到片段返回堆栈中。

android.view.InflateException: Binary XML file line #9: Error inflating class fragment

片段活动

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" />

................

选择新位置片段

@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,它扩展了 SupportMapFragment 类并初始化了地图。

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 代码。

它适合我。

【问题讨论】:

    标签: android fragment supportmapfragment


    【解决方案1】:

    您始终可以使用FragmentTransaction.add() 而不是FragmentTransaction.replace()

    这会将包含地图的片段保留在新片段下方。

    您可能希望将背景设置为不透明,并使用FragmentTransaction.addToBackStack()将其添加到后台堆栈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多