1

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

该应用程序不得使用支持v4(sdk 11+)/ FragmentActivity。

空的片段。

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    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_width="match_parent" 
    android:layout_height="match_parent" 
    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?谢谢。

回答

0

放入清单,android的关键? 例如:

<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

+0

叶氏。和权限,和,等。如何实例化自定义MapFragment? –

+0

这是关于这个问题的另一篇文章:http://stackoverflow.com/questions/13719263/unable-instantiate-android-gms-maps-mapfragment你添加了库谷歌播放服务? http://developer.android.com/google/play-services/setup.html – jackgris

1

如果你使用,你必须使用SupportMapFragment类,而不是MapFragment的地图片段的支持库。你的活动应该是支持图书馆的FragmentActivity。以及片段管理器。你必须得到SupportFragmentManager()。

看看这个代码:

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控制台是否已打开Goog​​le Map ANDROID API V2,而不仅仅是可能会导致与您描述的结果相同的Google Map API V2。

+0

不应该将地图设置为异步添加getMapAsync(this)并实现onMapReady? – jul

+0

我从来没有使用过这个选项,现在我正在使用Maps API一段时间。 –

1

视图尚未创建,这就是为什么的GetMap()返回null,地图不存在,把你的代码中的onResume