Google Maps API v2 自定义 MapFragment + SimpleFragment

Posted

技术标签:

【中文标题】Google Maps API v2 自定义 MapFragment + SimpleFragment【英文标题】:Google Maps API v2 Custom MapFragment + SimpleFragment 【发布时间】:2013-01-05 16:10:38 【问题描述】:

我需要创建一个简单的应用程序,其中包含 1.自定义MapFragment,可以显示当前位置(LocationListener?),两个标记等。 2. 简单的空片段。

应用不得使用 support v4 (sdk 11+) / FragmentActivity。

空片段。

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="@android:color/black" >
</RelativeLayout>

类:

public class FirstFragment extends Fragment

public FirstFragment() 


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.first_fragment, container, false);
    return view;


地图片段(尝试使其成为单例)。

XML:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/map"
  android:layout_
  android:layout_
  class="com.google.android.gms.maps.MapFragment"/>

public class ThirdMapFragment extends MapFragment 
public static MapFragment instance;

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) 
    View view;
    view = arg0.inflate(R.layout.map_fragment, arg1, false);
    return view;


public static MapFragment getInstance() 
    if (instance == null) 
        instance = newInstance();
    
    // NullPointerException in getMap() ???
    // instance.getMap().addMarker(new MarkerOptions().position(new LatLng(41.1, 39)));
    return instance;


@Override
public void onCreate(Bundle arg0) 
    super.onCreate(arg0);


主要活动:

public class ActivityMain extends Activity implements OnClickListener 
FragmentManager fragmentManager;
FragmentTransaction transaction;
FirstFragment firstFragment;
MapFragment mapFragment;

// Buttons
Button b4;

int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    fragmentManager = getFragmentManager();
    transaction = fragmentManager.beginTransaction();

    b4 = (Button) findViewById(R.id.button4);

    b1.setOnClickListener(this);

    firstFragment = new FirstFragment();
    mapFragment =  ThirdMapFragment.getInstance();



@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;


@Override
public void onClick(View v) 
    makeTransaction(v.getId());




private void makeTransaction(int id) 
    i++;
    transaction = fragmentManager.beginTransaction();
    if (i == 1) 
        transaction.replace(R.id.relativeLayout, firstFragment).commit();
     else if (i == 2) 
        transaction.replace(R.id.relativeLayout, secondFragment).commit();
     else 
    transaction.replace(R.id.relativeLayout, mapFragment).commit();
        i = 0;
    


R.id.relativeLayout - main.xml 中的布局

但我没有看到地图(带有缩放按钮的空白屏幕)以及如何制作 LocationListener?谢谢。

【问题讨论】:

【参考方案1】:

如果您使用支持库,则必须使用 SupportMapFragment 类,而不是 MapFragment 用于地图片段。您的活动应该是一个 FragmentActivity 以支持库。以及片段管理器。你必须getSupportFragmentManager()。

看看这段代码:

import com.google.android.gms.common.GooglePlayServicesUtil;
import android.os.Bundle;
import com.google.android.gms.maps.*;

public class Map extends android.support.v4.app.FragmentActivity

private GoogleMap map;


@Override
protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()) == 0)
        
            map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        

如果您在进行这些更改后仍然看不到地图。检查您的 API 控制台,您已打开 Google Map ANDROID API V2,而不仅仅是可能导致与您描述的结果相同的 Google Map API V2。

【讨论】:

不应该异步设置地图加上getMapAsync(this)并实现onMapReady? 我从未使用过此选项,而且我使用 Maps API 已经有一段时间了。【参考方案2】:

视图尚未创建,这就是为什么 getMap() 返回 null,地图不存在,将代码放入 onResume

【讨论】:

【参考方案3】:

放入manifest,android的key? 例如:

<application
        android:icon="@drawable/android"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyB2s6isdfsghDfgdfdfgDFGDG-yi4-aAYUma0Owc"/>

https://developers.google.com/maps/documentation/android/start

【讨论】:

是的。还有权限、等。如何实例化自定义 MapFragment? 这是关于该主题的另一篇文章:***.com/questions/13719263/…您添加了库 google-play-service? developer.android.com/google/play-services/setup.html

以上是关于Google Maps API v2 自定义 MapFragment + SimpleFragment的主要内容,如果未能解决你的问题,请参考以下文章

居中位图标记(Google Maps Android API v2)

将来自 url 的图像添加到自定义 InfoWindow google maps v2

带有自定义标记的 android Maps API v2

Android Maps Library V2 缩放控件自定义位置

Google Maps Android API V2 检查 Google Maps 应用程序是不是被禁用

使用 Google Maps API v2 获取行车路线