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

时间:2015-01-30 00:14:24

标签: android google-maps android-mapview

我使用FragmentActivitySupportMapFragment运行了Maps V2 但是现在我正试图让它不使用上面的工作,而是使用 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>

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"));
    }
}

我使用Fragments时,我的AndroidManifest.xml没有变化 所以我知道钥匙和其他一切正在发挥作用。

我删除了支持v4 .jar,因为如果Fragments我不需要它 哪里没用过。

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

我尝试在onMapReady()中做更多的事情,但事实并非如此 似乎做得很好。

很少有使用MapView用于V2的示例。

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

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

更新1:

我尝试了几件事,但仍然没有运气。 我添加了所有转发的public final void onDestroy()等。 这次没有抱怨,而且,在Logcat中,看起来它仍然试图在支持v4 .jar中引用Fragment,所以我甚至添加了支持v4 .jar, 用--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();
    }
} 

1 个答案:

答案 0 :(得分:10)

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

所需要的只是跟随父项活动或片段的API docs和转发(至少指定的)生命周期回调到MapView

  

此类的用户必须将包含此视图的ActivityFragment的所有生命周期方法转发到此类中的相应方法。特别是,您必须转发以下方法:

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

然后,当然,使用API docs中指定的MapView#getMapAsync(OnMapReadyCallback)来获取对GoogleMap使用的MapView的引用。