无法使用Google Maps V2 MapView获取地图

use*_*522 5 android google-maps android-mapview

我使用了Maps V2 FragmentActivity,SupportMapFragment 但是现在我正试图让它工作不使用上面但是使用 MapView.地图文档似乎说你可以这样做.

该应用程序运行,但我只是得到一个黑屏,没有地图.

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

<com.google.android.gms.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

Java文件:

package com.jps.mapstestthree;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.LayoutInflater;
import android.content.Context;

import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;


public class MainActivity extends Activity
implements OnMapReadyCallback
{

    private GoogleMap googleMap;
    private View view;
    private MapView mapView;
    Context context;

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

        context = (Context)getApplication();

        LayoutInflater inflater =(LayoutInflater)
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.activity_main, null);  
        mapView = (MapView)view.findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try
        {
            initilizeMap();
        }
        catch (Exception e)
        {
        }

    }

    private void initilizeMap()
    {
        if ( googleMap == null )
        {
             mapView.getMapAsync(this);         
        }
    }

    @Override
    protected void onResume()
    {
        mapView.onResume();
        super.onResume();

        initilizeMap();
    }

    @Override
    public void onMapReady(GoogleMap map)
    {
        map.addMarker(new MarkerOptions()
        .position(new LatLng(0, 0))
        .title("Marker"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用Fragments时的AndroidManifest.xml没有变化,所以我知道Key和其他所有东西都在工作.

我删除了支持v4 .jar,因为我不需要它,如果没有使用碎片.

我尝试使用其他方法,比如onDestory()定义,因为它似乎希望所有方法都进行MapView转发,但它抱怨它们,所以我删除了它们.

我尝试了更多的东西onMapReady(),但似乎没有多大好处.

很少有使用MapViewV2的例子.

是否可以在不使用Fragment和使用MapView的情况下显示地图?

如果是这样,我需要做什么才能显示出来?

更新1:

我尝试了几件事,但仍然没有运气.我添加了所有转发public final void onDestroy()等等,这次没有抱怨,而且,在Logcat中,看起来它仍然试图在支持v4 .jar中引用Fragment,所以我甚至添加了支持v4 .jar,re -did一个带有--subprojects的android更新项目,但我仍然得到一个黑屏,但确实有它的标题.

是的,这是同一个项目,我只是重命名了主项目名称,包名称相同,Key与工作时相同.

我还删除了带有地图的顶级导入.*并添加了所需的单个导入,并且它做了一个干净的构建.

更新2:

我终于在没有使用支持v4 .jar的情况下工作了!和任何碎片.我RawMapViewDemo.java播放服务示例中找到了示例源代码,基本上改变了应用程序,用--subprojects重新运行'android update project',它工作了!!

这是完整的来源,希望它可以帮助某人.

package com.jps.mapstestthree;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

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

public class MainActivity extends Activity
    implements OnMapReadyCallback
{

    // Google Map
    private GoogleMap googleMap;
    private View view;
    private MapView mapView;

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

        mapView = (MapView)findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);

        mapView.getMapAsync(this);
    }


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

    @Override
    public void onMapReady(GoogleMap map)
    {
        map.addMarker(new MarkerOptions()
            .position(new LatLng(0, 0))
            .title("Marker"));
    }


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

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

    @Override
    public final void onPause()
    {
        mapView.onPause();
        super.onPause();
    }
} 
Run Code Online (Sandbox Code Playgroud)

dm7*_*m78 10

你的问题的更新让你对如何解决这个问题充满了神秘感.

所需要的只是遵循API文档并将父Activity或Fragment的生命周期回调(至少指定的)转发到MapView:

这个类的用户必须转发来自所有生命周期方法ActivityFragment含有此视图在这个类的相应的一些.特别是,您必须转发以下方法:

  • onCreate(Bundle)
  • onResume()
  • onPause()
  • onDestroy()
  • onSaveInstanceState()
  • onLowMemory()

然后,当然,使用API文档中MapView#getMapAsync(OnMapReadyCallback)指定的方式来获取对所使用的引用.GoogleMapMapView