首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MapFragment返回空

MapFragment返回空
EN

Stack Overflow用户
提问于 2013-10-01 05:46:43
回答 6查看 15.3K关注 0票数 6
代码语言:javascript
复制
mMapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentByTag(MAP_FRAGMENT_TAG);

        // We only create a fragment if it doesn't already exist.
        if (mMapFragment == null) {
          mMapFragment = SupportMapFragment.newInstance();


            // Then we add it using a FragmentTransaction.
            FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG);
             fragmentTransaction.commit();


            mMap=mMapFragment.getMap();

通过此代码,映射是可见的,但无法访问映射。

mMap=mMapFragment.getMap();显示空值错误如何修复

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-10-01 06:05:15

更新1: getMap()废弃的

最好是使用getMapAsync()MapFragment/SupportMapFragment方法。如何使用下面所示的方法(从它们的documentation复制)的示例。

代码语言:javascript
复制
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;
import android.app.Activity;
import android.os.Bundle;

public class MapPane extends Activity implements OnMapReadyCallback {

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

        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        LatLng sydney = new LatLng(-33.867, 151.206);

        map.setMyLocationEnabled(true);
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

        map.addMarker(new MarkerOptions()
                .title("Sydney")
                .snippet("The most populous city in Australia.")
                .position(sydney));
    }

}

引用谷歌的MapFragment/SupportMapFragment

只有在加载了底层映射系统并且片段中的底层视图存在时,才能使用getMap()获取getMap。这个类会自动初始化地图系统和视图;但是,当它准备就绪时,您无法得到保证,因为这取决于Google服务APK的可用性。如果GoogleMap不可用,getMap()将返回null。

在您的代码中,您在提交GoogleMap后立即检索MapFragment。等待MapFragment完全加载到活动中,这样您就可以得到GoogleMap

也许,您可以使用接口将GoogleMapMapFragment传递到Activity,如下所示。

代码语言:javascript
复制
public class MyMapFragment extends SupportMapFragment
{
  private MapCallback callback;

  public void setMapCallback(MapCallback callback)
  {
    this.callback = callback;
  }

  public static interface MapCallback
  {
     public void onMapReady(GoogleMap map);
  }

  @Override public void onActivityCreated(Bundle savedInstanceState)
  {
     super.onActivityCreated(savedInstanceState);
     if(callback != null) callback.onMapReady(getMap());     
  }
}


public class MyActivity extends Activity implements MyMapFragment.MapCallback
{
   // .........
  @Override
  public void onCreate(Bundle onsavedInstanceState)
  {
        mMapFragment = (MyMapFragment) getSupportFragmentManager()
                .findFragmentByTag(MAP_FRAGMENT_TAG);

        // We only create a fragment if it doesn't already exist.
        if (mMapFragment == null) {
               mMapFragment = MyMapFragment.newInstance();

               mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded

               // Then we add it using a FragmentTransaction.
               FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
               fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG);
               fragmentTransaction.commit();

         }
         else
         {
               mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded
         }

  @Override
  public void onMapReady(GoogleMap map)
  {
     // Do what you want to map
  }

}
票数 17
EN

Stack Overflow用户

发布于 2013-10-01 05:50:20

进口部分

代码语言:javascript
复制
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

在oncreate内部

代码语言:javascript
复制
SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
    mMap = mapFragment.getMap();

和Xml部分

代码语言:javascript
复制
<fragment 
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

确保你已经投入了

代码语言:javascript
复制
<meta-data android:name="com.google.android.maps.v2.API_KEY"
              android:value="api key"/> 

在你的<application></application>标签里。

并在显能者档案中给予这些许可

代码语言:javascript
复制
<permission
          android:name="packagename.permission.MAPS_RECEIVE"
          android:protectionLevel="signature"/>
    <uses-permission android:name="packagename.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>
票数 3
EN

Stack Overflow用户

发布于 2013-10-01 05:51:34

您的xml应该有SupportMapFragment

代码语言:javascript
复制
<fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19108843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档