使用自定义支持片段将 getMap 替换为 getMapAsync

Posted

技术标签:

【中文标题】使用自定义支持片段将 getMap 替换为 getMapAsync【英文标题】:Replace getMap with getMapAsync with custom support fragment 【发布时间】:2018-10-02 22:04:09 【问题描述】:

尝试将我的 google 依赖项从 9.0.0 更新到 15.0.0。但我必须更新

getMap();

getMapAsync();

因为 getMap();在最新版本的谷歌库中已弃用。

问题是我正在使用自定义片段来加载视图。我这样做是因为我有 3 种不同的地图类型可以根据用户选择加载到地图视图中。但这并不能让我毫无错误地执行 getMapAsync。

这是我的代码:

private void setUpMapIfNeeded() 
    if (mMapFragment == null) 
        mMapFragment = new CustomSupportMapFragment(); 

        mMapFragment.setOnMapCreatedListener(new CustomSupportMapFragment.MapViewCreatedListener() 

            @Override
            public void onMapCreated() 
                boolean needUpdate = mMap == null;
                mMap = mMapFragment.getMapAsync();

                if (mMap != null)
                    setUpMap(needUpdate);
            
        );

    

    FragmentTransaction ft = getChildFragmentManager().beginTransaction();
    ft.replace(R.id.map, mMapFragment);
    ft.commit();

但我收到错误:

getMapAsync (OnMapReadyCallback) in SupportMapFragment cannot be applied to ()

所以我尝试像这样添加 thisgetContext()

getMapAsync(this);

getMapAsync(getContext));

但两者都返回错误,无法应用。

有什么想法吗?对不起,我对 java 的理解是新的,我正在学习。我已经尝试在 *** 和谷歌上搜索这个问题,但只能在使用常规 supportmapfragment 而不是自定义 supportmapfragment 时找到解决方案。

这是我的 setUpMap 方法,如果它有助于您理解:

private void setUpMap(boolean needUpdate) 
    boolean location_permission_granted = (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    if (!location_permission_granted) 
        requestPermissions(new String[]Manifest.permission.ACCESS_FINE_LOCATION, 200);
     else 
        mMap.setMyLocationEnabled(true);
    

    mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() 
        @Override
        public void onCameraChange(CameraPosition cameraPosition) 

            if (LOAD_PARTICULAR_MAP == 1) 
                if (cameraPosition.zoom > AppConstants.MAX_ZOOM) 
                    CameraUpdate upd = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, AppConstants.MAX_ZOOM);
                    mMap.moveCamera(upd);
                


                float maxZoom = 4f;
                if (cameraPosition.zoom > maxZoom) 
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
                    return;
                
                float minZoom = 0f;
                if (cameraPosition.zoom < minZoom) 
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(minZoom));
                    return;
                
            
        
    );
    mMap.setOnMapLongClickListener(this);
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMapClickListener(this);
    mMap.setOnMarkerDragListener(this);
    mMap.setOnMarkerClickListener(this);
//        mBtnMapType.setVisibility(View.VISIBLE);

    mMap.getUiSettings().setScrollGesturesEnabled(true);

    //mBtnLegend.setVisibility(View.VISIBLE);
    //updateLegendButton();
    updateMapType(mSettings.getMapType(GoogleMap.MAP_TYPE_TERRAIN));
    /*mTileProvider = new TranslucentUrlTileProvider(AppConstants.SERVER_URL, AppConstants.SERVER_URL_FREE);
//        mTileProvider.setPro(!mIsPro.showPurchaseDialog());
    //mTileProvider.setOpacity(mOpacity);
    mTileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mTileProvider));*/
    if (needUpdate)
        if (LOAD_PARTICULAR_MAP != 4) 
            gotoMyLocation();
        
//        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()       
//            @Override
//            public boolean onMarkerClick(Marker marker) 
//                if (marker != null) 
//                    openGoogleMap(marker);
//                    return true;
//                
//                return false;
//            
//        );

    switch (LOAD_PARTICULAR_MAP) 

        case 1:

            auroraOverMap();
            mMap.animateCamera(CameraUpdateFactory.zoomTo(0f));

            break;

        case 2:

            lightPollutionMap();

            break;

        case 3:

            loadCloudMap();

            break;

        case 4:

            highestValueView();
//                mMap.animateCamera( CameraUpdateFactory.zoomTo( 12f )    );

            break;
    

【问题讨论】:

不知道为什么要投反对票,没有人可以提供帮助:(我打算向任何可以帮助我解决问题的人捐款。保持帮助社区成员的精神。 【参考方案1】:

你不能通过调用得到GoogleMap对象

mMap = mMapFragment.getMapAsync();

你应该使用这样的代码:

mMapFragment.getMapAsync(new OnMapReadyCallback() 
    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
    
);

其中mMap 是全局变量:

public class MainActivity extends AppCompatActivity 

    private GoogleMap mMap;
    ...

在您获得mMap 后,您可以使用它来设置您的地图:

mMapFragment.getMapAsync(new OnMapReadyCallback() 
    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
        if (mMap != null)
                setUpMap(needUpdate);
    
);

另外,看看Official Tutorial。

【讨论】:

好的,我试试看,让你知道谢谢你的回答:) 我会及时更新

以上是关于使用自定义支持片段将 getMap 替换为 getMapAsync的主要内容,如果未能解决你的问题,请参考以下文章

不支持请求方法“GET”将@GetMapping 更改为Delete 方法后出错

从android中的片段更改自定义ActionBar标题

从 DOM 中读取 HTML 片段并向其中添加自定义数据

JavaFX自定义窗口标题栏

如何让自定义视图观察包含片段的生命周期事件而不是活动?

在tablayout中替换片段