无法解析方法 getMap() [英] Cannot resolve method getMap()

查看:27
本文介绍了无法解析方法 getMap()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让地图片段在我的应用程序中工作,但在尝试获取我的 GoogleMap 对象时仍然出现错误.

I am trying to get a map fragment working within my application and I continue to get an error when trying to get my GoogleMap object.

FragmentWithMap.java

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_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().但出于某种原因,我在这里收到错误

I copied the code from a different app, where the method getMap() is merely deprecated, so I doubt the problem is in the code itself. I have no issue with it being deprecated, and I prefer not to use the getMapAsync() if I don't have to. But here for some reason I recieve the error

无法解析方法‘getMap()’"

"Cannot resolve method 'getMap()'"

.我也收到错误

错误:任务':app:compileDebugJavaWithJavac'的执行失败.

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

编译失败;有关详细信息,请参阅编译器错误输出."

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

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

Though I can't be sure if it's connected to this issue.

推荐答案

getMap() 方法之前已被弃用,现在已被移除.如果您查看SupportMapFragment 文档,就会发现它不存在.

The getMap() method was previously deprecated, and now it's been removed. If you look at the documentation for SupportMapFragment, it's not there.

您还可以在发行说明中看到:

之前弃用的 getMap() 函数在Google Play 服务 SDK.(它仍然可以在谷歌提供给 Android 设备的播放服务 APK.) getMap()功能自 2014 年 12 月起已弃用.请参阅发布博客发布以获取有关从 getMap() 转换为 getMapAsync() 的帮助.

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().

来自博客文章:

在 2014 年 12 月,我们弃用了 getMap() 以支持 getMapAsync().从这个版本开始,你需要按顺序使用 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(),就很简单.

So, just use getMapAsync(), it's simple.

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

First have your Fragment implement the OnMapReadyCallback interface:

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

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

Then, modify your setUpMapIfNeeded() code, and add the onMapReady() callback:

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();
}

这篇关于无法解析方法 getMap()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆