0

我有一个谷歌地图应用程序,它在片段中使用地图视图来显示地图。除了不显示室内地图外,它运行良好。我决定创建一个精简版的代码来找出问题所在。它仍然存在:-(

在室内地图的文档中,它说以下

SetIndoorEnabled
Sets whether indoor maps should be enabled. Currently, indoor maps can 
only be shown on one map at a time and by default, this is the first map 
added to your application. To enable indoor maps on another map, you 
must first disable indoor maps on the original map. If you try to enable 
indoor maps when it is enabled on another map, nothing will happen and 
this will return false. When Indoor is not enabled for a map, all 
methods related to indoor will return null, or false.

我看不到我启用了多个地图,但我想知道片段的使用是否会以某种方式混淆它。任何帮助/建议都会非常受欢迎。

我的 MainActivity.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    Fragment map_fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_2);
        showTheMap();
    }

    public void showTheMap() {
        map_fragment = new MapFragment();
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.map, map_fragment);
        ft.commit();
    }
}

MapFrament.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;

public class MapFragment extends Fragment {

private MapView mapView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    final FrameLayout parent = (FrameLayout)   inflater.inflate(R.layout.fragment_map, container, false);

    mapView = (MapView) parent.findViewById(R.id.mapfragment);
    mapView.getMapAsync(new OnMapReadyCallback() {
                            @Override
                            public void onMapReady(GoogleMap googleMap) {
                                CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17);
                                googleMap.animateCamera(cameraUpdate);

                            }
                        }
    );
    mapView.onCreate(savedInstanceState);

    return parent;
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

@Override
public void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

}

activity_main_2.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

</android.support.design.widget.AppBarLayout>

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    class="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

</android.support.design.widget.CoordinatorLayout>

fragment_map.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.gms.maps.MapView
    android:id="@+id/mapfragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center" />

</FrameLayout>

如果您将代码移动到 MainActivity 它可以完美运行。请参见 MainActivity.Java 下面的代码

public class MainActivity extends AppCompatActivity {

MapView mapView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_1);
    mapView = (MapView) findViewById(R.id.map);
    mapView.getMapAsync(new OnMapReadyCallback() {
                            @Override
                                public void onMapReady(GoogleMap googleMap) {

                                    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17);
                                    googleMap.animateCamera(cameraUpdate);

                                }
                            }
        );
        mapView.onCreate(savedInstanceState);
}


@Override
protected void onStart() {
    super.onStart();
}

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

@Override
public void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
protected void onStop() {
    super.onStop();
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}
}

用于此的 activity_main_1 xml 是....

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout     
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.example.program.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

</android.support.design.widget.AppBarLayout>

<com.google.android.gms.maps.MapView
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center" />

</android.support.design.widget.CoordinatorLayout>
4

1 回答 1

1

以下是我的问题的解决方案。

在 MainActivity 中声明 myGoogleMap

public static GoogleMap myGoogleMap = null;

在 onMapReady 添加这些行作为第一个操作

if (MainActivity.myGoogleMap != null) {
   MainActivity.myGoogleMap.setIndoorEnabled(false);
   googleMap.setIndoorEnabled(true);

   MainActivity.myGoogleMap = googleMap;

   CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(-35.0176402, 138.5459909), 17);
   MainActivity.myGoogleMap.animateCamera(cameraUpdate);
}

似乎 getMapAsync 被调用了两次,因此创建了 2 个谷歌地图,第二个正在显示。

由于室内地图仅出现在第一张地图上,因此您必须将第一张地图设置为 false,然后将第二张地图设置为 true。

这对我来说似乎很狡猾。不确定它是一个错误还是我缺乏理解。

于 2016-03-30T06:30:03.410 回答