【问题标题】:Can't get map with Google Maps V2 MapView无法使用 Google Maps V2 MapView 获取地图
【发布时间】:2015-01-30 00:14:24
【问题描述】:

我让 Maps V2 使用 FragmentActivitySupportMapFragment 但现在我试图让它工作而不是使用上面的,而是使用 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"));
    }
}

我的 AndroidManifest.xml 与我使用 Fragments 时一样 所以我知道钥匙和其他一切都在工作。

我删除了支持 v4 .jar,因为如果 Fragments 我不需要它 不使用的地方。

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

我尝试在onMapReady() 中做更多的事情,但没有 似乎做得很好。

在 V2 中使用 MapView 的例子很少。

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

如果是这样,我需要做什么才能让某些东西出现?

更新 1:

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

【问题讨论】:

  • logcat 中有什么东西吗?使用与工作时相同的调试密钥进行签名?
  • 片段的行为类似于活动。此外,如果它不是唯一的方法,它是实现地图的最简单方法。也许您可以在本文档中找到您喜欢的其他方式。 doc你也可以试试这个。 Link
  • 您的解决方案的更新将更适合作为答案发布。
  • 谢谢,我在你的问题中得到了我的解决方案。这一行我缺少 mapView.getMapAsync(this);

标签: android google-maps android-mapview


【解决方案1】:

您的问题的更新为您如何解决这个问题留下了神秘的气氛。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多