getMap()得到错误?

时间:2017-09-12 15:48:24

标签: java android

我正在尝试交互式infoWindow,其中一个是堆栈溢出的答案。

链接如下:

interactive infowindow

但是我在代码中使用getMap()时遇到错误。虽然我尝试使用getMapAsync但无法解决问题。请尽快帮助我。如果任何新的代码可用于交互式信息窗口,请分享代码。

    public class MainActivity extends Activity {    
    private ViewGroup infoWindow;
    private TextView infoTitle;
    private TextView infoSnippet;
    private Button infoButton;
    private OnInfoWindowElemTouchListener infoButtonListener;

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

        final MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        final MapWrapperLayout mapWrapperLayout = (MapWrapperLayout)findViewById(R.id.map_relative_layout);
        final GoogleMap map = mapFragment.getMap();

        // MapWrapperLayout initialization
        // 39 - default marker height
        // 20 - offset between the default InfoWindow bottom edge and it's content bottom edge 
        mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20)); 

        // We want to reuse the info window for all the markers, 
        // so let's create only one class member instance
        this.infoWindow = (ViewGroup)getLayoutInflater().inflate(R.layout.info_window, null);
        this.infoTitle = (TextView)infoWindow.findViewById(R.id.title);
        this.infoSnippet = (TextView)infoWindow.findViewById(R.id.snippet);
        this.infoButton = (Button)infoWindow.findViewById(R.id.button);

        // Setting custom OnTouchListener which deals with the pressed state
        // so it shows up 
        this.infoButtonListener = new OnInfoWindowElemTouchListener(infoButton,
                getResources().getDrawable(R.drawable.btn_default_normal_holo_light),
                getResources().getDrawable(R.drawable.btn_default_pressed_holo_light)) 
        {
            @Override
            protected void onClickConfirmed(View v, Marker marker) {
                // Here we can perform some action triggered after clicking the button
                Toast.makeText(MainActivity.this, marker.getTitle() + "'s button clicked!", Toast.LENGTH_SHORT).show();
            }
        }; 
        this.infoButton.setOnTouchListener(infoButtonListener);


        map.setInfoWindowAdapter(new InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                // Setting up the infoWindow with current's marker info
                infoTitle.setText(marker.getTitle());
                infoSnippet.setText(marker.getSnippet());
                infoButtonListener.setMarker(marker);

                // We must call this to set the current marker and infoWindow references
                // to the MapWrapperLayout
                mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
                return infoWindow;
            }
        });

        // Let's add a couple of markers
        map.addMarker(new MarkerOptions()
            .title("Prague")
            .snippet("Czech Republic")
            .position(new LatLng(50.08, 14.43)));

        map.addMarker(new MarkerOptions()
            .title("Paris")
            .snippet("France")
            .position(new LatLng(48.86,2.33)));

        map.addMarker(new MarkerOptions()
            .title("London")
            .snippet("United Kingdom")
            .position(new LatLng(51.51,-0.1)));
    }

    public static int getPixelsFromDp(Context context, float dp) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dp * scale + 0.5f);
    }
}

错误即将发生,因为Google已删除了getMap但却不知道替代解决方案。

错误:(149,42)错误:找不到符号方法getMap()

3 个答案:

答案 0 :(得分:2)

您现有的代码是:

 final MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
    final GoogleMap map = mapFragment.getMap();

试试这个而不是:

 MapFragment mapFragment; // declare in global scope
 GoogleMap googleMap; // declare in global scope

将此代码放在OnCreate方法中:

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

                mapFragment.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap map) {
                        googleMap = map;

                        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                        googleMap.setMyLocationEnabled(false); // false to disable
                        googleMap.setOnMarkerClickListener(onMarkerClick);
                        googleMap.setOnInfoWindowClickListener(onInfoWindowClick);
                        googleMap.getUiSettings().setZoomControlsEnabled(true);// Display Zoom Controls
                        googleMap.setMyLocationEnabled(true);// Display My Location Control
                    }
                });
            }

将像素转换为DP使用此:

    public int getPixelsFromDp(int px){ 
       DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); 
    return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); 
} 

答案 1 :(得分:1)

onCreatView()方法中使用getMapAsync ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)) .getMapAsync(this)

同样补充OnMapReadyCallback界面,并覆盖它的方法

在属于onMapReady()界面的方法onMapReadyCallback中,执行您需要的所有地图操作。它看起来就像你下次的操作后

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


    // some action with our map
    mMap.addMarker(new MarkerOptions().position(randomPosition).title("Random Title"));
    mMap.addMarker(new MarkerOptions().position(antoherRandomPosition).title("Another RND Title"));

    // some processes with db
    DataBaseMapFragment database = new DataBaseMapFragment(dbHelper, mMap);
    database.createBD();


    // permission to check, if gps access is granted
    if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }

    //another actions with map
    mMap.setMyLocationEnabled(true);
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(camera, 13));
    mMap.setBuildingsEnabled(true);
    mMap.setOnMapLongClickListener(this);
    mMap.setOnMyLocationChangeListener(myLocationChangeListener);
    mMap.setOnMarkerClickListener(this);

提供Google documentation and guide

检查它以了解有关Android中的地图的更多信息并明确

答案 2 :(得分:0)