上第二充气的Android地图v2的错误(Android map v2 error on secon

2019-08-04 04:36发布

我想在我的应用程序使用新的Android地图。

我有哪些布局包含(除其他事项外)一个FragmentActivity:

<LinearLayout a:id="@+id/fragment_container"
    a:layout_width="fill_parent"
    a:layout_height="100dp"
    a:layout_weight="1"/>

它也有一个按钮,用于改变使用该片段(主要来自样品项目复制):

if (condition) {
    fragment = new Fragment1();
} else {
    fragment = new LocationFragment();
}
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();

和LocationFragment是:

public class LocationFragment extends SupportMapFragment{
private GoogleMap mMap;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    view = inflater.inflate(R.layout.map_fragment, container, false);
    setUpMapIfNeeded();
    return view;
}

@Override
public void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment)  getActivity().getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}

private void setUpMap() {
    mMap.addMarker(new MarkerOptions().position(new LatLng(60.02532, 30.370552)).title(getString(R.string.map_current_location)));
}
}

XML布局:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      class="com.google.android.gms.maps.SupportMapFragment"/>

问题是,当我们与LocationFragment替换片段的第二次Android是无法从XML膨胀。 它崩溃上线:

view = inflater.inflate(R.layout.map_fragment, container, false);

有例外:

12-17 01:47:31.209: ERROR/AndroidRuntime(4679): FATAL EXCEPTION: main
    android.view.InflateException: Binary XML file line #4: Error inflating class fragment
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:587)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    at my.package.LocationFragment.onCreateView(LocationFragment.java:29)
    ...

我不知道如何解决它。 我认为,这可能与一个老问题,你不能使用一个以上的地图视图(在Android地图V1发现的问题)来连接。 但在v2和片段箱支撑它必须与地图片段取代片段容器的方式,对吗?

Answer 1:

您正在扩大SupportMapFragment 。 这是完全正常的,尽管我不确定这种模式将如何共同成为(这是所有有点太新)。

然而, SupportMapFragment 一个片段,并知道如何显示的地图。 你不应该重写onCreateView()在大多数情况下,你当然不应该重写onCreateView()并试图夸大包含一个布局文件<fragment> 指回元素SupportMapFragment

这里是一个示例应用程序使用SupportMapFragment从地图V2库。 该活动将加载有一个布局SupportMapFragment

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>


Answer 2:

删除你的MapView片段到onDestroyView方法。

Fragment fragment = (getFragmentManager().findFragmentById(R.id.mapview));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();


Answer 3:

我不延长SupportMapFragment而只是使用XML作为在上面的回答,包括它(常规)片段内,但我得到了同样的结果... android.view.InflateException:二进制XML文件行#4:错误充气类时我试图膨胀的含片段以来发射第二时间。

我通过充气从XML的MapFragment而是留在包含XML片段使用FragmentLayout一个占位符,然后在运行时编程方式添加此MapFragment解决了这个问题。 完美的作品。

含片段XML看起来是这样的:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- This is commented out because it crashed on second inflate.
    <fragment
        android:id="@+id/mapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="60dp"
        class="com.google.android.gms.maps.SupportMapFragment" />
    -->

    <FrameLayout
            android:id="@+id/mapFragmentHole"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginBottom="60dp"
            android:layout_gravity="center_vertical|center_horizontal" /> 
    .
    .
    .

然后在我的片段包含Java代码我这样做。 这也说明了如何配置MapFragment之前,它的使用GoogleMapOptions外观。

_view = inflater.inflate(R.layout.fragment_map, container, false);

GoogleMapOptions gmo = (new GoogleMapOptions()).zoomControlsEnabled(false).rotateGesturesEnabled(false);
mapFragment = SupportMapFragment.newInstance(gmo);
FragmentTransaction fragmentTransaction = getFragmentManager()
        .beginTransaction();
fragmentTransaction.add(R.id.mapFragmentHole, mapFragment);
fragmentTransaction.commit();

在上面的代码mapFragment是一个成员变量,以便以后可以访问它GoogleMap对象以后像这样获取...

GoogleMap map = mapFragment.getMap();

不过,如果你充气并做MapFragment switcheroo在onCreateView你将不能够得到相同的方法内有效的GoogleMap对象,所以你必须要等到以后的数据填充地图。 在我的代码我启动一个后台线程来从我onCreateView方法加载数据。 一旦数据被加载它调用一个方法重上UiThread以填补工件地图。

希望这可以帮助。 祝好运!

-M。



文章来源: Android map v2 error on second inflating