【问题标题】:Indoor maps are not appearing in a mapView in a Fragment室内地图未出现在 Fragment 的 mapView 中
【发布时间】:2016-03-24 11:54:49
【问题描述】:

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

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

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>

【问题讨论】:

    标签: android fragment android-mapview google-indoor-maps


    【解决方案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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多