java - 无法解析方法 getMap()

标签 java android google-maps

我正在尝试让一个 map fragment 在我的应用程序中工作,但在尝试获取我的 GoogleMap 对象时仍然出现错误。

FragmentWithMap.java

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;



public class FragmentWithMap extends android.support.v4.app.Fragment {
    private OnFragmentInteractionListener mListener;
    private static final double LAT = 32.084;
    private static final double LON = 34.8878;
    Place place;
    private GoogleMap mMap;
    private View view;
    private Marker marker;
    int userIcon = FragmentWithDetails.userIcon;

    public static FragmentWithMap newInstance(Place place) {
        Bundle args = new Bundle();
        if (place != null) {
            args.putInt("id", place.getId());
            args.putString("name", place.getName());
            args.putString("address", place.getAddress());
            args.putFloat("lat", place.getLat());
            args.putFloat("lng", place.getLng());
        }
        FragmentWithMap fragment = new FragmentWithMap();
        fragment.setArguments(args);
        return fragment;
    }

    public FragmentWithMap() {
        //empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null && getArguments().getString("name") != null) {
            place = new Place(getArguments().getInt("id"), getArguments().getString("name"),
                    getArguments().getString("address"), getArguments().getFloat("lat"),
                    getArguments().getFloat("lng"));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_fragment_with_map, container, false);
        }
        setUpMapIfNeeded();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        android.support.v4.app.Fragment f = getFragmentManager()
                .findFragmentById(R.id.fragmnet_container_map);
        if (f != null) {
            try {
                getFragmentManager().beginTransaction().remove(f).commit();
            } catch (IllegalStateException ise) {
                Log.d("FragmentWithMap", "Already closed");
            }
        }

        ViewGroup parentViewGroup = (ViewGroup) view.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeAllViews();
        }
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public void showPlace(Place place) {
        setPlace(place);
        setUpMap();
    }

    public void setPlace(Place place) {
        this.place = place;
    }


    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }

    private void setUpMapIfNeeded() {
        // Do a null check
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.


            Fragment mmm = getChildFragmentManager().findFragmentById(R.id.fragment_map2);
            mMap = ((SupportMapFragment) mmm).getMap();

            // Check if we were successful
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private void setUpMap() {
        double lat = LAT;
        double lng = LON;
        String name = "You are here";
        if (place != null) {
            lat = place.getLat();
            lng = place.getLng();
            name = place.getName();
        }
        if (marker != null) {
            marker.remove();
        }
        LatLng position = new LatLng(lat, lng);
        MarkerOptions markerOptions = new MarkerOptions().
                position(position).
                title(name).
                icon(BitmapDescriptorFactory.fromResource(userIcon)).
                snippet("Your last recorded location");

        marker = mMap.addMarker(markerOptions);
        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        mMap.setMyLocationEnabled(true);
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(position, 15);
        mMap.animateCamera(cameraUpdate);
    }

}

这是 XML

fragment_with_map.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_map2"
    tools:context="com.example.eldad.myplacesapp.FragmentWithMap"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    />

我从另一个应用程序复制了代码,其中 getMap() 方法只是被弃用了,所以我怀疑问题出在代码本身。我对它被弃用没有任何问题,如果我不需要,我宁愿不使用 getMapAsync()。但是由于某种原因,我收到了错误

"Cannot resolve method 'getMap()'"

。我也收到一个错误

"Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

Compilation failed; see the compiler error output for details."

虽然我不能确定它是否与这个问题有关。

最佳答案

getMap() 方法以前已弃用,现在已被删除。如果您查看 documentation for SupportMapFragment ,它不存在。

您也可以在 release notes 中查看:

The previously-deprecated getMap() function is no longer available in the Google Play services SDK. (It is still available in the Google Play services APK that is delivered to Android devices.) The getMap() function has been deprecated since December 2014. See the release blog post for help with converting from getMap() to getMapAsync().

从博文中:

In December 2014 we deprecated getMap() in favor of getMapAsync(). From this release onwards, you'll need to use getMapAsync() in order to compile your apps.

所以,只需使用 getMapAsync(),很简单。

首先让你的 Fragment 实现 OnMapReadyCallback 接口(interface):

public class FragmentWithMap extends android.support.v4.app.Fragment
          implements OnMapReadyCallback { 

然后,修改你的 setUpMapIfNeeded() 代码,并添加 onMapReady() 回调:

private void setUpMapIfNeeded() {
  if (mMap == null) {
    SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map2);
    mapFrag.getMapAsync(this);
  }
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    setUpMap();
}

关于java - 无法解析方法 getMap(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232747/

相关文章:

java - intellij 如何计算对象实例的 4 位数字 ID?

java - 从java控制台程序的命令行读取一段

java - Spring - WebSocket - Origin 'null' 因此不允许访问

android - startActivityForResult 调用窗口在返回结果之前被杀死

javascript - Angular 谷歌地图/NodeJS : Display Markers from Database

google-maps - 给定一个 lat/lng 坐标,计算 10 公里区域的最小和最大 lat/lng 值

javascript - Geochart - 用特殊颜色标记一个国家

java添加dns缓存记录

android - 在 Android M 中,来电响铃时更改铃声模式没有任何效果

Android以编程方式将XML形状设置为可绘制